Flutter分页网格视图插件paged_grid_view的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter分页网格视图插件paged_grid_view的使用

paged_grid_view 是一个用于在 Flutter 中实现分页网格视图的插件。它通过调整 GridView 的性能来提供更好的滚动体验。

安装

首先,在你的 pubspec.yaml 文件中添加 paged_grid_view 作为依赖项:

dependencies:
  paged_grid_view: ^最新版本号

然后运行 flutter pub get 来获取新的依赖项。

使用

以下是一个简单的示例,展示了如何使用 PagedGridView 插件:

import 'package:flutter/material.dart';
import 'package:paged_grid_view/paged_grid_view.dart';

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return PagedGridView.builder(
      itemCount: 1000,
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          mainAxisExtent: MediaQuery.sizeOf(context).width / 10,
          crossAxisCount: 10),
      scrollDirection: Axis.horizontal,
      onPageChanged: (index) {
        debugPrint('changed to page $index');
      },
      itemBuilder: (context, index) {
        return ColoredBox(
          key: UniqueKey(),
          color: Color(Random().nextInt(0xffffff) + 0xff000000),
        );
      },
    );
  }
}

示例

下面是一个更完整的示例,展示了如何使用 PagedGridView 和普通 GridView 进行比较:

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:paged_grid_view/paged_grid_view.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Paged GridView Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  double itemsPerColumn = 50;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('PagedGridView Demo'),
      ),
      body: Column(
        children: <Widget>[
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              children: [
                const Text("Axis item count:"),
                Expanded(
                  child: Slider(
                    max: 100,
                    min: 1,
                    divisions: 99,
                    label: itemsPerColumn.round().toString(),
                    value: itemsPerColumn,
                    onChanged: (double value) {
                      setState(() {
                        itemsPerColumn = value;
                      });
                    },
                  ),
                ),
              ],
            ),
          ),
          const Padding(
            padding: EdgeInsets.all(8.0),
            child: Center(child: Text("GridView:")),
          ),
          Expanded(
              child: GridView.builder(
            itemCount: (itemsPerColumn * itemsPerColumn * 10).round(),
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                mainAxisExtent:
                    MediaQuery.sizeOf(context).width / itemsPerColumn.round(),
                crossAxisCount: itemsPerColumn.round()),
            scrollDirection: Axis.horizontal,
            physics: const PageScrollPhysics(),
            itemBuilder: (context, index) {
              debugPrint("gridView build item $index");
              return ColoredBox(
                key: UniqueKey(),
                color: Color(Random().nextInt(0xffffff) + 0xff000000),
              );
            },
          )),
          const Padding(
            padding: EdgeInsets.all(8.0),
            child: Center(child: Text("PagedGridView:")),
          ),
          Expanded(
              child: PagedGridView.builder(
            itemCount: (itemsPerColumn * itemsPerColumn * 10).round(),
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                mainAxisExtent:
                    MediaQuery.sizeOf(context).width / itemsPerColumn.round(),
                crossAxisCount: itemsPerColumn.round()),
            scrollDirection: Axis.horizontal,
            onPageChanged: (index) {
              debugPrint('changed to page $index');
            },
            itemBuilder: (context, index) {
              debugPrint("pagedGridView build item $index");
              return ColoredBox(
                key: UniqueKey(),
                color: Color(Random().nextInt(0xffffff) + 0xff000000),
              );
            },
          )),
        ],
      ),
    );
  }
}

更多关于Flutter分页网格视图插件paged_grid_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter分页网格视图插件paged_grid_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 paged_grid_view 插件在 Flutter 中实现分页网格视图的示例代码。paged_grid_view 是一个用于创建分页网格视图的 Flutter 插件,非常适合用于显示大量图片或其他内容,并且希望以分页的形式加载数据。

首先,确保你已经在 pubspec.yaml 文件中添加了 paged_grid_view 依赖:

dependencies:
  flutter:
    sdk: flutter
  paged_grid_view: ^x.y.z  # 替换为最新版本号

然后运行 flutter pub get 来获取依赖。

以下是一个完整的示例代码,展示了如何使用 paged_grid_view 来创建一个分页网格视图:

import 'package:flutter/material.dart';
import 'package:paged_grid_view/paged_grid_view.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Paged GridView Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final PageController _pageController = PageController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Paged GridView Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: PagedGridView<int>(
          pageController: _pageController,
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2, // 每行显示的项目数量
            crossAxisSpacing: 4.0,
            mainAxisSpacing: 4.0,
            childAspectRatio: 1.0, // 项目宽高比
          ),
          builderDelegate: PagedChildBuilderDelegate<int>(
            itemCount: 100, // 总项目数量
            itemBuilder: (context, index, realIndex) {
              return Container(
                color: Colors.primary.withOpacity(0.8),
                child: Center(
                  child: Text(
                    'Item $realIndex',
                    style: TextStyle(color: Colors.white),
                  ),
                ),
              );
            },
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 跳转到下一页
          _pageController.nextPage(
            duration: const Duration(milliseconds: 300),
            curve: Curves.easeInOut,
          );
        },
        tooltip: 'Next Page',
        child: Icon(Icons.arrow_forward),
      ),
    );
  }

  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }
}

代码解释

  1. 依赖导入:确保在 pubspec.yaml 中添加了 paged_grid_view 依赖。

  2. 页面结构

    • 使用 MaterialAppScaffold 创建一个基本的 Material Design 应用。
    • Scaffoldbody 中,使用 Padding 创建一个内边距。
  3. PagedGridView

    • pageController:控制分页视图的滚动。
    • gridDelegate:使用 SliverGridDelegateWithFixedCrossAxisCount 来定义网格布局,指定每行显示的项目数量、项目之间的间距以及项目的宽高比。
    • builderDelegate:使用 PagedChildBuilderDelegate 来构建每个项目,itemCount 指定总项目数量,itemBuilder 用于构建每个项目的小部件。
  4. FloatingActionButton

    • 添加一个浮动操作按钮,用于手动跳转到下一页。
  5. 资源释放

    • dispose 方法中释放 PageController 以避免内存泄漏。

这个示例代码展示了如何使用 paged_grid_view 插件来创建一个分页网格视图,并且提供了基本的分页控制功能。你可以根据实际需求调整项目数量、网格布局和每个项目的样式。

回到顶部