Flutter分页管理插件paginator的使用

Flutter分页管理插件paginator的使用

Paginator简介

Paginator 是一个用于简化 Flutter 应用程序分页功能的插件。无论您处理的是大数据集还是需要平滑分页功能,Paginator 都提供了内置工具来高效地获取、分页和显示数据。

Pub Version License

开始使用

  1. pubspec.yaml 文件中添加 Paginator 包。

    dependencies:
      paginator: ^0.0.1
    
  2. 导入包:

    import 'package:paginator/paginator.dart';
    

使用示例

以下是一个完整的示例,展示如何使用 Paginator 插件进行分页管理。

示例代码
import 'package:example/bloc/user/user_bloc.dart'; // 假设有一个用户数据流
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paginator/paginator.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Paginator Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: BlocProvider<UserBloc>(
        create: (context) => UserBloc(), // 创建一个数据流实例
        child: const UserListScreen(),
      ),
    );
  }
}

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

  final int page = 1; // 当前页码

  [@override](/user/override)
  Widget build(BuildContext context) {
    return PaginatedList(
      paginationDataFetcher: ({bool refreshFetching = false}) {
        context.read<UserBloc>().add(FetchUsersEvent(page: page)); // 触发数据加载事件
      },
      builder: (context, scrollController) {
        return Scaffold(
          appBar: AppBar(
            title: const Text("用户列表"),
            centerTitle: true,
          ),
          body: BlocBuilder<UserBloc, UserState>(
            builder: (context, state) {
              if (state is UserInitial) {
                return const Center(
                  child: CircularProgressIndicator(),
                ); // 加载中
              } else if (state is UserFetchFailure) {
                return Center(
                  child: Text(state.errorMessage), // 加载失败
                );
              } else if (state is UserFetchSuccess) {
                final users = state.users;

                return ListView.separated(
                  controller: scrollController,
                  separatorBuilder: (_, __) => const SizedBox(height: 16),
                  padding: const EdgeInsets.only(left: 16, right: 16, bottom: 24),
                  shrinkWrap: true,
                  itemCount: state.hasReachedEnd ? users.length : users.length + 1,
                  itemBuilder: (context, index) {
                    if (!state.hasReachedEnd && index >= users.length) {
                      return const Center(
                        child: Padding(
                          padding: EdgeInsets.symmetric(vertical: 8),
                          child: CircularProgressIndicator(),
                        ),
                      ); // 加载更多时的占位符
                    }
                    final user = users[index];
                    return ListTile(
                      minTileHeight: 70,
                      leading: CircleAvatar(
                        radius: 16,
                        child: Text(user.id.toString()),
                      ),
                      minLeadingWidth: 50,
                      title: Text(user.name),
                    );
                  },
                );
              }
              return const SizedBox(); // 默认返回空
            },
          ),
        );
      },
    );
  }
}

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

1 回复

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


paginator 是一个用于 Flutter 的分页管理插件,它可以帮助你轻松地实现分页加载数据的功能。使用 paginator 插件,你可以简化分页逻辑,并且与 Flutter 的 ListViewGridView 等组件无缝集成。

以下是 paginator 插件的基本使用步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  paginator: ^1.0.0  # 请使用最新版本

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

2. 创建 Paginator 实例

paginator 提供了一个 Paginator 类,你可以通过它来管理分页数据。你需要为 Paginator 提供一个数据加载函数,该函数会根据页码加载数据。

import 'package:paginator/paginator.dart';

class MyPaginator extends Paginator<MyDataModel> {
  MyPaginator() : super(
    initialPage: 1,  // 初始页码
    loadPage: _loadPage,  // 数据加载函数
  );

  static Future<PageResponse<MyDataModel>> _loadPage(int page) async {
    // 模拟异步加载数据
    await Future.delayed(Duration(seconds: 2));
    
    // 假设这是从 API 获取的数据
    final data = List.generate(10, (index) => MyDataModel(page * 10 + index));
    
    // 返回分页数据
    return PageResponse(
      items: data,
      hasMore: page < 5,  // 假设总共有 5 页数据
    );
  }
}

3. 使用 Paginator 构建 UI

你可以使用 Paginatorbuild 方法来构建分页列表。Paginator 提供了 ListViewGridView 等构建器,你可以根据需要选择。

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

class MyPaginatedList extends StatelessWidget {
  final MyPaginator paginator = MyPaginator();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Paginated List'),
      ),
      body: PaginatorListView<MyDataModel>(
        paginator: paginator,
        itemBuilder: (context, item, index) {
          return ListTile(
            title: Text('Item ${item.id}'),
          );
        },
        loadingBuilder: (context) {
          return Center(child: CircularProgressIndicator());
        },
        errorBuilder: (context, error, retryCallback) {
          return Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text('Error: $error'),
                ElevatedButton(
                  onPressed: retryCallback,
                  child: Text('Retry'),
                ),
              ],
            ),
          );
        },
        emptyBuilder: (context) {
          return Center(child: Text('No data available.'));
        },
      ),
    );
  }
}

class MyDataModel {
  final int id;

  MyDataModel(this.id);
}

4. 处理分页逻辑

Paginator 会自动处理分页逻辑。当用户滚动到列表底部时,Paginator 会自动加载下一页数据。你也可以通过 paginator.loadNextPage() 手动触发加载下一页数据。

5. 其他配置

Paginator 还提供了一些其他配置选项,例如自定义分页大小、初始加载状态等。你可以根据需要进一步定制。

MyPaginator() : super(
  initialPage: 1,
  loadPage: _loadPage,
  pageSize: 20,  // 每页大小
  initialLoading: true,  // 是否在初始化时自动加载第一页数据
);
回到顶部