Flutter分页管理插件gamma_smart_pagination的使用

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

Flutter分页管理插件gamma_smart_pagination的使用

简介

gamma_smart_pagination 是一个用于实现无限滚动分页的Flutter插件,支持下拉刷新功能。它可以帮助开发者轻松地实现分页加载和刷新的功能,同时提供了多种状态(如加载中、刷新中、无更多数据等)的指示器。

功能特点

  • 下拉刷新:用户可以通过下拉手势刷新数据。
  • 上拉加载更多:当用户滚动到底部时,自动加载更多数据。
  • 多种控制器状态:支持加载中、刷新中、无更多数据、加载失败、刷新失败等多种状态。
  • 状态指示器:提供不同的Widget来显示当前的状态,例如无数据、加载失败、无更多数据等。

支持的平台

  • Flutter Android
  • Flutter iOS
  • Linux (未测试)
  • Windows (未测试)
  • MacOS (未测试)
  • Fuchsia (未测试)

安装

pubspec.yaml 文件中添加以下依赖:

dependencies:
  gamma_smart_pagination: ^1.0.4

然后在Dart文件中导入该插件:

import 'package:gamma_smart_pagination/gamma_smart_pagination.dart';

使用方法

  1. 创建一个 GammaSmartPagination 小部件。
  2. 将其包裹在任何可滚动的小部件(如 ListViewGridView)外部。
  3. 传递所需的 GammaControllerScrollController,以及其他可用的参数。
注意事项

GammaSmartPagination 实际上是一个 SingleChildScrollView,因此需要注意父级小部件的高度不能是无限的。对于包裹在 GammaSmartPagination 内部的 ListView,需要设置 shrinkWrap: truephysics: NeverScrollableScrollPhysics(),以避免滚动冲突。

完整示例代码

以下是一个完整的示例代码,展示了如何使用 gamma_smart_pagination 插件来实现分页加载和刷新功能。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Gamma Smart Pagination Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ExampleApp(),
    );
  }
}

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

  [@override](/user/override)
  State<ExampleApp> createState() => _ExampleAppState();
}

class _ExampleAppState extends State<ExampleApp> {
  // 初始化控制器
  GammaController gammaController = GammaController();
  ScrollController scrollController = ScrollController();

  // 模拟的数据列表
  List<String> itemsList = [];
  bool isLoading = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化时加载数据
    fetchItems();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Gamma Smart Pagination Example'),
      ),
      body: SafeArea(
        child: isLoading ? _getLoadingIndicator : _buildBody(),
      ),
    );
  }

  // 构建主页面内容
  Widget _buildBody() {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Expanded(
          // 关键部分:使用 GammaSmartPagination 包裹 ListView
          child: GammaSmartPagination(
            gammaSmartController: gammaController,
            scrollController: scrollController,
            onLoadMore: () => loadMore(), // 加载更多数据的回调
            onRefresh: () => refreshItems(), // 刷新数据的回调
            itemCount: itemsList.length, // 数据项的数量
            header: Container(
              height: 300.0,
              color: Colors.orange, // 可选的头部Widget
            ),
            child: ListView.separated(
              shrinkWrap: true, // 必须设置为 true
              physics: const NeverScrollableScrollPhysics(), // 必须设置为 NeverScrollableScrollPhysics
              itemBuilder: (context, index) => ListTile(
                title: Text(itemsList[index]),
              ),
              separatorBuilder: (context, index) => const Divider(),
              itemCount: itemsList.length,
            ),
          ),
        ),
      ],
    );
  }

  // 显示加载中的指示器
  Widget get _getLoadingIndicator => const Center(
        child: CircularProgressIndicator(),
      );

  // 模拟从网络获取数据
  Future<void> fetchItems() async {
    setState(() {
      isLoading = true;
    });
    await Future.delayed(const Duration(seconds: 1)); // 模拟网络延迟
    final fakeItems = List.generate(10, (index) => 'Item ${index + 1}');
    // 更新控制器状态为闲置
    gammaController.setIdle();
    setState(() {
      itemsList = fakeItems;
      isLoading = false;
    });
  }

  // 模拟加载更多数据
  Future<void> loadMore() async {
    await Future.delayed(const Duration(seconds: 1)); // 模拟网络延迟
    final fakeItems = List.generate(10, (index) => 'Item ${itemsList.length + index + 1}');
    // 更新控制器状态为加载完成
    gammaController.setLoadingCompleted();
    setState(() {
      itemsList = [...itemsList, ...fakeItems];
    });
  }

  // 模拟刷新数据
  Future<void> refreshItems() async {
    await Future.delayed(const Duration(seconds: 1)); // 模拟网络延迟
    final fakeItems = List.generate(10, (index) => 'Item ${index + 1}');
    // 更新控制器状态为刷新完成
    gammaController.setRefreshingCompleted();
    setState(() {
      itemsList = fakeItems;
    });
  }

  [@override](/user/override)
  void dispose() {
    // 释放控制器资源
    gammaController.dispose();
    scrollController.dispose();
    super.dispose();
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用gamma_smart_pagination插件进行分页管理的示例代码。这个插件可以帮助你轻松地实现分页加载数据的功能。

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

dependencies:
  flutter:
    sdk: flutter
  gamma_smart_pagination: ^最新版本号 # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来是一个简单的示例,展示如何使用gamma_smart_pagination进行分页加载数据:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final PaginationController _paginationController = PaginationController();
  List<String> _items = [];

  @override
  void initState() {
    super.initState();
    // 初始化分页控制器,设置初始页面和每页加载的项数
    _paginationController.itemCountPerPage = 10;
    _paginationController.addPageRequestListener((pageKey) {
      loadMoreData(pageKey);
    });
  }

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

  Future<void> loadMoreData(int pageKey) async {
    // 模拟网络请求数据
    await Future.delayed(Duration(seconds: 1));
    int start = pageKey * _paginationController.itemCountPerPage;
    int end = start + _paginationController.itemCountPerPage;
    List<String> newData = List.generate(end - start, (index) => "Item ${start + index}");
    
    setState(() {
      _items.addAll(newData);
      // 更新分页控制器的总项数
      _paginationController.totalItemCount = 100; // 假设总共有100项数据
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('分页管理示例'),
      ),
      body: Column(
        children: [
          Expanded(
            child: PaginationView<String>(
              paginationController: _paginationController,
              builderDelegate: PaginationBuilderDelegate<String>(
                itemBuilder: (_, item, index) {
                  return ListTile(
                    title: Text(item),
                  );
                },
                emptyBuilder: () => Center(child: Text("没有更多数据")),
                errorBuilder: (_, error) => Center(child: Text("加载数据出错: $error")),
              ),
            ),
          ),
          if (_paginationController.hasNextPage)
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: ElevatedButton(
                onPressed: () => _paginationController.nextPage(),
                child: Text('加载更多'),
              ),
            ),
        ],
      ),
    );
  }
}

代码解释:

  1. 依赖添加:在pubspec.yaml中添加gamma_smart_pagination依赖。
  2. 分页控制器:在_MyHomePageState中创建一个PaginationController实例,用于管理分页状态。
  3. 分页监听:在initState中设置分页请求监听器,当需要加载新页面时调用loadMoreData方法。
  4. 数据加载loadMoreData方法模拟网络请求,根据页码加载数据,并更新UI。
  5. 分页视图:使用PaginationView组件显示分页数据,并根据数据状态显示不同的UI(如加载中、无数据、出错等)。
  6. 加载更多按钮:如果还有下一页数据,显示一个加载更多按钮,点击按钮时调用_paginationController.nextPage()方法加载下一页数据。

这样,你就成功地在Flutter项目中集成了gamma_smart_pagination插件,并实现了分页加载数据的功能。

回到顶部