Flutter分页管理插件sig_pagination的使用

Flutter分页管理插件sig_pagination的使用

此Flutter插件通过集成signals包和pull_to_refresh_flutter3简化了分页管理。它提供了一个方便的PaginationScreen小部件来处理分页数据的获取、显示和刷新。

Demo Video

特性

  • 简易集成分页数据获取。
  • 支持下拉刷新和无限滚动。
  • 可自定义UI组件用于加载、空状态和错误处理。
  • 内置搜索功能。

开始使用

安装

pubspec.yaml文件中添加sig_pagination依赖:

dependencies:
  sig_pagination: any

然后运行flutter pub get以获取该包。

使用方法

以下是一个使用PaginationScreen小部件的基本示例:

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

// 假设PlaneRequest类已经定义好,并且fetchPlanes方法已经实现
class PlaneRequest {
  static final PlaneRequest _instance = PlaneRequest._internal();
  factory PlaneRequest() => _instance;
  PlaneRequest._internal();

  Future<List<Map<String, dynamic>>> fetchPlanes({required Pagination pagination}) async {
    // 模拟异步请求数据
    await Future.delayed(Duration(seconds: 2));
    return List.generate(10, (index) => {"name": "Plane $index"});
  }
}

// 空状态屏幕
class EmptyScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(child: Text("No Data Available"));
  }
}

// 错误状态屏幕
class ErrorScreen extends StatelessWidget {
  final dynamic error;
  final dynamic signal;
  final dynamic trace;

  ErrorScreen({required this.error, required this.signal, required this.trace});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(child: Text("Error: $error"));
  }
}

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

  [@override](/user/override)
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  Pagination pagination = Pagination();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        useMaterial3: false,
      ),
      home: Scaffold(
        appBar: AppBar(title: const Text('EXAMPLE')),
        body: PaginationScreen(
          pagination: pagination,
          future: () => PlaneRequest.instance.fetchPlanes(
            pagination: pagination,
          ),
          emptyWidget: const EmptyScreen(),
          loadingWidget: const CircularProgressIndicator(),
          errorWidget: (error, trace, signal) {
            return ErrorScreen(
              error: error,
              signal: signal,
              trace: trace,
            );
          },
          pageBuilder: (data) {
            return ListView.separated(
              padding: const EdgeInsets.only(top: 20),
              separatorBuilder: (context, index) => const Divider(),
              itemCount: data.length,
              itemBuilder: (context, index) {
                var item = data[index];
                return ListTile(
                  title: Text(item["name"]), // 显示数据
                );
              },
            );
          },
        ),
      ),
    );
  }
}

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

1 回复

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


当然,关于Flutter分页管理插件 sig_pagination 的使用,下面是一个基本的代码案例,展示了如何在Flutter应用中使用该插件进行分页管理。

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

dependencies:
  flutter:
    sdk: flutter
  sig_pagination: ^最新版本号  # 请替换为当前最新版本号

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

接下来是一个简单的示例代码,展示了如何使用 sig_pagination 插件来实现分页功能:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Sig Pagination 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(initialPage: 1);
  List<String> _items = List.generate(20, (index) => "Item $index"); // 初始数据

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Sig Pagination Demo'),
      ),
      body: RefreshIndicator(
        onRefresh: _refreshList,
        child: PaginationView(
          controller: _paginationController,
          builderDelegate: PaginationBuilderDelegate<String>(
            itemBuilder: (context, item, index) {
              return ListTile(
                title: Text(item),
              );
            },
            pageCount: 5, // 总页数,这里假设每页显示4个item
            itemCountPerPage: 4, // 每页显示的项目数
            onLoadMore: _loadMoreItems,
          ),
        ),
      ),
    );
  }

  Future<void> _refreshList() async {
    // 模拟网络请求刷新数据
    await Future.delayed(Duration(seconds: 2));
    setState(() {
      _items = List.generate(20, (index) => "Refreshed Item $index");
      _paginationController.resetPage(); // 重置分页控制器到第一页
    });
  }

  Future<void> _loadMoreItems(int page) async {
    // 模拟网络请求加载更多数据
    await Future.delayed(Duration(seconds: 1));
    int start = (page - 1) * 4; // 计算当前页数据的起始索引
    int end = start + 4; // 计算当前页数据的结束索引
    List<String> newItems = List.generate(end - start, (index) => "Loaded Item ${start + index}");
    setState(() {
      _items.addAll(newItems);
    });
  }
}

代码说明:

  1. 依赖安装:在 pubspec.yaml 中添加 sig_pagination 依赖。
  2. 分页控制器:使用 PaginationController 来管理分页状态。
  3. 数据加载:在 _loadMoreItems 方法中模拟加载更多数据,并更新 _items 列表。
  4. 刷新功能:使用 RefreshIndicator 实现下拉刷新功能,并在 _refreshList 方法中模拟刷新数据。
  5. 分页视图:使用 PaginationViewPaginationBuilderDelegate 来构建分页视图,并指定每页显示的项目数和总页数。

这个示例展示了基本的分页功能,包括加载更多数据和下拉刷新。你可以根据实际需求调整每页显示的项目数和加载数据的逻辑。

回到顶部