Flutter分页列表插件ts_paginated_list的使用
Flutter分页列表插件ts_paginated_list的使用
ts_paginated_list
是一个用于Flutter应用中的分页列表插件,支持多种分页方式,并且可以与不同的滚动视图集成。本文将介绍如何在Flutter项目中使用该插件。
插件特点
- TsPaginatedList: 直接作为Scaffold的body使用。
- TsPaginatedPageView: 类似于PageView,但带有分页功能。
- TsPaginatedListInsideScroll: 可以嵌入到ListView、SingleChildScrollView等滚动视图中。
使用方法
数据请求示例
/// 这是一个基本的数据请求示例。
///
/// 以下示例适用于任何TsPaginated组件...
Future<TsPaginatedListResult<ModelName>> fetchData(int page, int limit) async {
final response = await http.get('https://api.example.com/data?page=$page&limit=$pageSize');
final data = json.decode(response.body);
final items = data['items'].map((item) => ModelName.fromJson(item)).toList();
return TsPaginatedListResult(
data: items,
isSuccess: response.statusCode == 200,
hasNext: data['hasNext'] ?? null,
);
}
TsPaginatedList 示例
Scaffold(
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: TsPaginatedList(
TsPaginatedListSettings.list(
initialPage: 0,
limit: 10,
leadingSpacing: 10,
fetchData: fetchData, // 数据获取函数
builder: (context, item, index) {
return YourWidget(item: item);
},
),
),
),
);
TsPaginatedListInsideScroll 示例
在CustomScrollView中使用
CustomScrollView(
controller: scrollControllerUnique, // 必须提供
slivers: [
YourWidget1(),
YourWidget2(),
TsPaginatedListInsideScroll.sliver(
TsPaginatedListSettings.insideListScrollAsList(
scrollController: scrollControllerUnique, // 必须提供(与前面相同)
initialPage: 0,
limit: 5,
fetchData: controller.fetchData,
builder: (context, item, index) {
return YourWidget(item: item);
},
),
),
],
);
// 或者在ListView/SingleChildScrollView中使用
ListView(
controller: scrollControllerUnique, // 必须提供
children: [
YourWidget1(),
YourWidget2(),
TsPaginatedListInsideScroll.nonSliver(
TsPaginatedListSettings.insideListScrollAsList(
scrollController: scrollControllerUnique, // 必须提供(与前面相同)
initialPage: 0,
limit: 5,
fetchData: controller.fetchData,
builder: (context, item, index) {
return YourWidget(item: item);
},
),
),
],
);
TsPaginatedPageView 示例
Scaffold(
body: TsPaginatedPageView(
TsPaginatedPageSettings(
initialPage: 0,
limit: 5,
fetchData: controller.fetchData,
builder: (context, item, index) {
return YourWidget(item: item);
},
),
),
);
注意事项/已知问题
- 如果您想在一个列表中使用两个
TsPaginatedListInsideScroll
小部件,目前这不被支持,可能会导致错误。(我们计划尽快实现此功能)
完整示例Demo
以下是一个完整的示例demo,展示了如何在Flutter项目中使用ts_paginated_list
插件:
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:ts_pagination_list_example/routes/app_pages.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'TsPaginationList Example',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const TsPaginationListExample(),
getPages: AppPages.routes,
);
}
}
class TsPaginationListExample extends StatelessWidget {
const TsPaginationListExample({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () => Get.toNamed(Routes.paginationBody),
child: const Text('Pagination list in body'),
),
),
const SizedBox(height: 15),
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () => Get.toNamed(Routes.paginationInsideList),
child: const Text('Pagination list existing scroll view'),
),
),
const SizedBox(height: 15),
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () => Get.toNamed(Routes.paginationPage),
child: const Text('Pagination page view'),
),
),
],
),
),
);
}
}
更多关于Flutter分页列表插件ts_paginated_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter分页列表插件ts_paginated_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用Flutter分页列表插件 ts_paginated_list
的代码示例。ts_paginated_list
是一个用于实现分页加载列表的Flutter插件,可以帮助你轻松地实现分页功能。
首先,确保你已经在 pubspec.yaml
文件中添加了 ts_paginated_list
依赖:
dependencies:
flutter:
sdk: flutter
ts_paginated_list: ^最新版本号
然后,运行 flutter pub get
来获取依赖。
接下来是一个完整的示例,展示如何使用 ts_paginated_list
插件来实现分页列表:
import 'package:flutter/material.dart';
import 'package:ts_paginated_list/ts_paginated_list.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Paginated List Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final PaginatedListController<int> _controller = PaginatedListController(
initialPage: 0,
pageSize: 10,
);
@override
void dispose() {
_controller.dispose();
super.dispose();
}
Future<List<int>> fetchData(int page) async {
// 模拟网络请求延迟
await Future.delayed(Duration(seconds: 1));
// 返回模拟数据,这里返回page * pageSize到(page + 1) * pageSize - 1的数字列表
return List.generate(10, (index) => page * 10 + index);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Paginated List Example'),
),
body: PaginatedListView<int>(
controller: _controller,
builder: (context, item, index) {
return ListTile(
title: Text('Item ${item}'),
);
},
onFetchPage: (page) async {
final data = await fetchData(page);
_controller.addPageItems(data);
},
errorWidget: (context, error, retry) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Error: $error'),
SizedBox(height: 10),
ElevatedButton(
onPressed: () => retry(),
child: Text('Retry'),
),
],
),
);
},
emptyWidget: Center(child: Text('No Data')),
),
);
}
}
代码解释
-
依赖引入:在
pubspec.yaml
中添加ts_paginated_list
依赖。 -
分页控制器:创建一个
PaginatedListController
实例,并设置初始页和每页大小。 -
数据获取:定义一个
fetchData
函数,模拟从网络获取分页数据。这里简单地使用Future.delayed
模拟网络延迟,并返回一个数字列表。 -
UI 构建:
- 使用
PaginatedListView
组件来构建分页列表。 controller
参数传入分页控制器。builder
参数用于构建每个列表项。onFetchPage
参数传入一个函数,用于在需要加载新页时调用,并获取数据。errorWidget
参数用于显示加载错误时的界面。emptyWidget
参数用于显示没有数据时的界面。
- 使用
运行这个示例应用,你会看到一个分页加载的列表,每页显示10个项目,并且在加载新页时会模拟网络延迟。
希望这个示例能帮你更好地理解如何使用 ts_paginated_list
插件来实现分页列表功能。