Flutter分页控制插件pagination_controller的使用
Flutter分页控制插件pagination_controller的使用
pagination_controller
插件为 Flutter 应用程序提供了抽象且可重用的分页逻辑。它支持不同的分页方法,如基于偏移量和基于页数的分页。此外,它还集成了 ScrollController
,以便在用户滚动时自动加载新数据。
特性
- 支持不同的分页方法:
OffsetPagination
、PagePagination
。 - 基于 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
更多关于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. 处理加载状态
你可以通过 PaginationController
的 state
来获取当前的加载状态,并根据状态显示不同的 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();