Flutter分页插件andomie_pagination的使用
Flutter分页插件andomie_pagination的使用
功能介绍
Pagination
类为 Flutter 应用程序提供了分页状态管理和数据检索的功能。它支持按滚动加载数据,处理滚动事件,并在有新数据可用时通知用户。通过预加载和错误处理等功能,简化了分页列表或网格的实现。
特性
- 按滚动分页加载数据。
使用方法
短示例
以下是一个简单的使用示例:
import 'package:andomie_pagination/pagination.dart';
void main() {
final pagination = Pagination<int>.init('example');
pagination.paginate(
controller: ScrollController(), // 提供一个 ScrollController
callback: (config) async {
// 数据获取逻辑
return PaginationResponse.value(result: [1, 2, 3], snapshot: 1);
},
notifier: (value) {
// 处理获取到的数据
print(value);
},
);
}
长示例
以下是一个完整的长示例,展示如何在 Flutter 应用中集成分页功能:
初始化分页实例
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:andomie_pagination/pagination.dart';
const kNumbersPagination = "numbers";
void main() {
// 初始化分页实例
Pagination.init<String>(
kNumbersPagination,
initialSize: 5, // 初始加载的数据条数
fetchingSize: 5, // 每次加载的新数据条数
limit: 1000, // 最大数据量限制
preload: 1000, // 预加载的数据量
);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter 分页',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(),
);
}
}
定义分页逻辑
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _scrollController = ScrollController();
Future<PaginationResponse<String>> loadData(PaginationConfig config) {
return Future.delayed(const Duration(seconds: 2)).then((_) {
final page = config.snapshotAsPage;
final fetchingSize = config.fetchingSize;
final items = List.generate(fetchingSize, (i) {
final number =
Pagination.realIndexOf<String>(kNumbersPagination, i) + 1;
return "Item number is $number";
});
return PaginationResponse.value(result: items, snapshot: page + 1);
});
}
[@override](/user/override)
void initState() {
super.initState();
// 将分页逻辑应用到 ScrollController
Pagination.apply<String>(
kNumbersPagination,
controller: _scrollController,
callback: loadData,
notifier: (data) {
log('新数据加载: $data');
setState(() {});
},
);
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xfff1f1f1),
appBar: AppBar(
title: const Text(
"FLUTTER 分页",
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
centerTitle: true,
),
floatingActionButton: FloatingActionButton.extended(
onPressed: () => Pagination.reloadOf<String>(kNumbersPagination),
backgroundColor: Theme.of(context).primaryColor,
label: const Text(
"重新加载",
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
),
body: ListView.builder(
padding: const EdgeInsets.symmetric(vertical: 16),
controller: _scrollController,
itemCount: Pagination.itemCountOf<String>(kNumbersPagination),
itemBuilder: (context, index) {
final item = Pagination.itemOf<String>(kNumbersPagination, index);
if (item.isPlaceholder) {
return const NumberItemPlaceholder();
} else {
return NumberItem(item: item.data!);
}
},
),
);
}
}
自定义分页项
class NumberItem extends StatelessWidget {
final String item;
const NumberItem({
super.key,
required this.item,
});
[@override](/user/override)
Widget build(BuildContext context) {
return Container(
height: 100,
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
),
alignment: Alignment.center,
child: Text(
item,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 24,
),
),
);
}
}
class NumberItemPlaceholder extends StatelessWidget {
const NumberItemPlaceholder({
super.key,
});
[@override](/user/override)
Widget build(BuildContext context) {
return Container(
height: 100,
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
),
alignment: Alignment.center,
child: const CircularProgressIndicator(),
);
}
}
更多关于Flutter分页插件andomie_pagination的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter分页插件andomie_pagination的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
andomie_pagination
是一个用于 Flutter 的分页插件,它可以帮助你轻松地实现分页功能。以下是如何使用 andomie_pagination
的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 andomie_pagination
依赖:
dependencies:
flutter:
sdk: flutter
andomie_pagination: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入包
在你的 Dart 文件中导入 andomie_pagination
包:
import 'package:andomie_pagination/andomie_pagination.dart';
3. 使用 PaginationController
PaginationController
是 andomie_pagination
的核心类,它负责管理分页逻辑。你可以通过它来加载数据、监听分页状态等。
class MyPaginationWidget extends StatefulWidget {
@override
_MyPaginationWidgetState createState() => _MyPaginationWidgetState();
}
class _MyPaginationWidgetState extends State<MyPaginationWidget> {
final PaginationController<int, MyDataModel> _paginationController =
PaginationController<int, MyDataModel>(
initialPage: 1,
pageSize: 10,
fetchData: (int page, int pageSize) async {
// 这里实现你的数据获取逻辑
// 例如从 API 获取数据
final response = await myApi.getData(page, pageSize);
return PaginationResult(
items: response.data,
totalItems: response.totalItems,
);
},
);
@override
void initState() {
super.initState();
_paginationController.loadFirstPage();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Pagination Example'),
),
body: PaginationListView<int, MyDataModel>(
paginationController: _paginationController,
itemBuilder: (context, item, index) {
return ListTile(
title: Text(item.name),
subtitle: Text(item.description),
);
},
emptyWidget: Center(
child: Text('No data available'),
),
errorWidget: (error) {
return Center(
child: Text('Error: $error'),
);
},
loadingWidget: Center(
child: CircularProgressIndicator(),
),
loadMoreWidget: Center(
child: Padding(
padding: EdgeInsets.all(16.0),
child: CircularProgressIndicator(),
),
),
),
);
}
@override
void dispose() {
_paginationController.dispose();
super.dispose();
}
}
4. 解释代码
- PaginationController: 这是分页控制器,负责管理分页逻辑。你需要提供一个
fetchData
函数来获取数据。 - PaginationListView: 这是一个
ListView
,它会根据PaginationController
的状态来显示数据、加载更多、显示错误等。 - itemBuilder: 用于构建每个列表项的 UI。
- emptyWidget: 当没有数据时显示的 Widget。
- errorWidget: 当加载数据出错时显示的 Widget。
- loadingWidget: 当加载数据时显示的 Widget。
- loadMoreWidget: 当加载更多数据时显示的 Widget。
5. 处理分页逻辑
在 fetchData
函数中,你需要实现从 API 或其他数据源获取数据的逻辑。返回的 PaginationResult
包含当前页的数据和总数据量。
6. 加载更多数据
PaginationListView
会自动处理滚动到底部时加载更多数据的逻辑。你不需要手动调用 loadNextPage
,除非你有特殊需求。
7. 其他功能
andomie_pagination
还支持其他功能,如刷新数据、跳转到指定页等。你可以通过 PaginationController
的方法来实现这些功能。
8. 示例 API 调用
假设你有一个 API 可以获取分页数据,你可以这样实现 fetchData
函数:
fetchData: (int page, int pageSize) async {
final response = await http.get(Uri.parse('https://api.example.com/data?page=$page&pageSize=$pageSize'));
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
return PaginationResult(
items: List<MyDataModel>.from(data['items'].map((x) => MyDataModel.fromJson(x))),
totalItems: data['totalItems'],
);
} else {
throw Exception('Failed to load data');
}
},