Flutter分页控制插件pagination_controller的使用

Flutter分页控制插件pagination_controller的使用

pagination_controller 插件为 Flutter 应用程序提供了抽象且可重用的分页逻辑。它支持不同的分页方法,如基于偏移量和基于页数的分页。此外,它还集成了 ScrollController,以便在用户滚动时自动加载新数据。

特性

  • 支持不同的分页方法OffsetPaginationPagePagination
  • 基于 Mixin 的分页处理:允许轻松集成到 Cubit 和 Flutter 状态管理方法中。
  • 错误和空状态处理:轻松管理错误、空列表和数据检索成功等不同状态。
  • 可定制化:允许使用不同的项目类型、分页策略和错误类型。

安装

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

dependencies:
  pagination_controller: ^0.0.1

然后运行 flutter pub get 来安装包。

使用

示例:使用 Cubit 进行分页

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

class TemplateData {
  final int index;

  const TemplateData(this.index);
}

List<TemplateData> _testDataList =
    List<TemplateData>.generate(30, (index) => TemplateData(index));

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

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

  @override
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  final controller =
      CubitPaginationController<TemplateData, OffsetPagination, String>(
    firstPagePointer: const OffsetPagination(offset: 0),
    getPageFunc: (pagination) {
      return Future.delayed(
          const Duration(seconds: 2),
          () => SuccessPaginationResult(
                itemList: _testDataList
                    .skip(pagination.offset)
                    .take(pagination.limit)
                    .toList(),
                pagination: pagination,
              ));
    },
  );

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Pagination Example')),
        body: SafeArea(
          child: RefreshIndicator(
            onRefresh: () async => controller.getFirst(),
            child: SingleChildScrollView(
              controller: controller.scrollController,
              child: CubitPaginatedListBuilder<TemplateData, OffsetPagination, String>(
                controller: controller,
                dataBuilder: (context, state, isProcessing) => Column(
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: [
                    ...state.itemList.map(
                      (e) => Container(
                        alignment: Alignment.center,
                        padding: const EdgeInsets.symmetric(vertical: 40),
                        child: Text(e.index.toString()),
                      ),
                    ),
                    if (isProcessing) const CircularProgressIndicator(),
                  ],
                ),
                emptyBuilder: (context, emptyState, isProcessing) => Container(
                  alignment: Alignment.center,
                  padding: const EdgeInsets.symmetric(vertical: 40),
                  child: const Text('No items available'),
                ),
                errorBuilder: (context, errorState, isProcessing) => Container(
                  alignment: Alignment.center,
                  padding: const EdgeInsets.symmetric(vertical: 40),
                  child: const Text('An error occurred'),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

示例:使用 ScrollController 进行分页

final flutterController = FlutterPaginationController<ItemType, PagePagination, ErrorType>(
  firstPagePointer: PagePagination(page: 1),
  getPageFunc: (pagination) async {
    // Fetch data from an API or database
  },
);

// 使用 flutterController 与任何可滚动的部件,例如 ListView

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

1 回复

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


pagination_controller 是一个用于 Flutter 的分页控制插件,它可以帮助你轻松地管理分页数据加载。这个插件通常用于处理无限滚动列表或分页加载的场景。下面是如何使用 pagination_controller 的基本步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 pagination_controller 依赖:

dependencies:
  flutter:
    sdk: flutter
  pagination_controller: ^0.0.1 # 请检查最新版本

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

2. 创建分页控制器

在你的 StatefulWidget 中,创建一个 PaginationController 实例。你需要指定一个加载数据的回调函数,该函数会在需要加载更多数据时被调用。

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

class MyPaginatedList extends StatefulWidget {
  @override
  _MyPaginatedListState createState() => _MyPaginatedListState();
}

class _MyPaginatedListState extends State<MyPaginatedList> {
  final PaginationController<int, MyDataItem> _paginationController =
      PaginationController<int, MyDataItem>(
    // 加载数据的回调函数
    fetchPage: (int pageKey, int pageSize) async {
      // 模拟从网络或数据库加载数据
      await Future.delayed(Duration(seconds: 2));
      List<MyDataItem> newItems = List.generate(
        pageSize,
        (index) => MyDataItem(id: pageKey * pageSize + index),
      );
      return PaginationResult(
        items: newItems,
        nextPageKey: pageKey + 1,
      );
    },
  );

  @override
  void initState() {
    super.initState();
    _paginationController.loadFirstPage();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Paginated List'),
      ),
      body: PaginationListView<int, MyDataItem>(
        paginationController: _paginationController,
        itemBuilder: (context, item, index) {
          return ListTile(
            title: Text('Item ${item.id}'),
          );
        },
      ),
    );
  }
}

class MyDataItem {
  final int id;

  MyDataItem({required this.id});
}

3. 使用 PaginationListView 显示数据

PaginationListView 是一个特殊的 ListView,它会自动处理分页加载。你只需要将 PaginationController 传递给它,并提供一个 itemBuilder 来构建每个列表项。

4. 处理加载状态

你可以通过 PaginationControllerstate 来获取当前的加载状态,并根据状态显示不同的 UI。

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('Paginated List'),
    ),
    body: PaginationListView<int, MyDataItem>(
      paginationController: _paginationController,
      itemBuilder: (context, item, index) {
        return ListTile(
          title: Text('Item ${item.id}'),
        );
      },
      loadingBuilder: (context) {
        return Center(
          child: CircularProgressIndicator(),
        );
      },
      errorBuilder: (context, error) {
        return Center(
          child: Text('Error: $error'),
        );
      },
      emptyBuilder: (context) {
        return Center(
          child: Text('No items found'),
        );
      },
    ),
  );
}

5. 处理分页加载

PaginationController 会自动在你滚动到列表底部时调用 fetchPage 回调函数来加载更多数据。你不需要手动处理分页逻辑。

6. 其他功能

pagination_controller 还提供了其他一些功能,比如刷新数据、重新加载第一页、处理错误等。你可以通过 PaginationController 的 API 来使用这些功能。

// 刷新数据
_paginationController.refresh();

// 重新加载第一页
_paginationController.loadFirstPage();

// 处理错误
_paginationController.retryLastFailedRequest();
回到顶部