Flutter分页查询Firestore插件paginate_firestore_plus的使用
Flutter分页查询Firestore插件paginate_firestore_plus的使用
该插件是原始paginate_firestore
的更新版本。原始插件由Venkatesh Prasad开发,现已不再维护。我们已经接手并更新了此插件,以确保其与最新版本的Firestore及其依赖项兼容。

安装
在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
paginate_firestore_plus: # 最新版本
然后运行flutter pub get
来安装它。
导入
在你的Dart文件中导入插件:
import 'package:paginate_firestore/paginate_firestore_plus.dart';
使用
基本用法
在你的应用中实现分页查询:
PaginateFirestore(
// item builder类型是必须的。
itemBuilder: (context, documentSnapshots, index) {
final data = documentSnapshots[index].data() as Map?;
return ListTile(
leading: CircleAvatar(child: Icon(Icons.person)),
title: data == null ? Text('Error in data') : Text(data['name']),
subtitle: Text(documentSnapshots[index].id),
);
},
// orderBy是必须的以启用分页
query: FirebaseFirestore.instance.collection('users').orderBy('name'),
// 更改类型
itemBuilderType: PaginateBuilderType.listView,
// 获取实时数据
isLive: true,
),
使用刷新监听器
如果你想在用户下拉刷新时刷新数据,可以使用PaginateRefreshedChangeListener
:
PaginateRefreshedChangeListener refreshChangeListener = PaginateRefreshedChangeListener();
RefreshIndicator(
child: PaginateFirestore(
itemBuilder: (context, documentSnapshots, index) => ListTile(
leading: CircleAvatar(child: Icon(Icons.person)),
title: Text(documentSnapshots[index].data()['name']),
subtitle: Text(documentSnapshots[index].id),
),
// orderBy是必须的以启用分页
query: FirebaseFirestore.instance.collection('users').orderBy('name'),
listeners: [
refreshChangeListener,
],
),
onRefresh: () async {
refreshChangeListener.refreshed = true;
},
)
示例代码
以下是一个完整的示例代码,展示了如何在Flutter应用中使用paginate_firestore_plus
插件进行分页查询Firestore。
import 'package:flutter/material.dart';
import 'package:paginate_firestore_plus/paginate_firestore.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Firestore pagination library',
theme: ThemeData(
primarySwatch: Colors.yellow,
visualDensity: VisualDensity.adaptivePlatformDensity,
brightness: Brightness.dark,
),
home: const HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Firestore pagination example'),
centerTitle: true,
),
body: Scrollbar(
// isAlwaysShown: true,
child: PaginateFirestore(
// 使用SliverAppBar在头部使其粘性
header: const SliverToBoxAdapter(child: Text('HEADER')),
footer: const SliverToBoxAdapter(child: Text('FOOTER')),
// item builder类型是必须的
itemBuilderType: PaginateBuilderType.listView, // 更改类型
itemBuilder: (context, documentSnapshots, index) {
final data = documentSnapshots[index].data() as Map?;
return ListTile(
leading: const CircleAvatar(child: Icon(Icons.person)),
title: data == null
? const Text('Error in data')
: Text(data['name']),
subtitle: Text(documentSnapshots[index].id),
);
},
// orderBy是必须的以启用分页
query: FirebaseFirestore.instance.collection('users').orderBy('name'),
itemsPerPage: 5,
// 获取实时数据
isLive: true,
),
),
);
}
}
更多关于Flutter分页查询Firestore插件paginate_firestore_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter分页查询Firestore插件paginate_firestore_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
paginate_firestore_plus
是一个用于在 Flutter 应用中实现 Firestore 分页查询的插件。它简化了分页逻辑,支持懒加载和无限滚动等功能。以下是如何在 Flutter 项目中使用 paginate_firestore_plus
插件的详细步骤。
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 paginate_firestore_plus
插件的依赖:
dependencies:
flutter:
sdk: flutter
paginate_firestore_plus: ^0.1.0 # 请确保使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 基本用法
假设你有一个 Firestore 集合 posts
,你想分页查询其中的文档。
创建分页查询
首先,创建一个 Query
对象用于分页查询。
import 'package:cloud_firestore/cloud_firestore.dart';
final query = FirebaseFirestore.instance
.collection('posts')
.orderBy('timestamp', descending: true);
使用 PaginateFirestorePlus
组件
接下来,使用 PaginateFirestorePlus
组件来实现分页查询和显示。
import 'package:flutter/material.dart';
import 'package:paginate_firestore_plus/paginate_firestore_plus.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class PaginatedPosts extends StatelessWidget {
final Query query;
const PaginatedPosts({Key? key, required this.query}) : super(key: key);
@override
Widget build(BuildContext context) {
return PaginateFirestorePlus(
itemBuilderType: PaginateBuilderType.listView,
itemBuilder: (context, documentSnapshot, index) {
final post = documentSnapshot[index].data() as Map<String, dynamic>;
return ListTile(
title: Text(post['title']),
subtitle: Text(post['content']),
);
},
query: query,
itemsPerPage: 10, // 每页加载的文档数量
isLive: true, // 是否实时监听数据变化
);
}
}
在页面中使用
在你的页面中使用 PaginatedPosts
组件,并传递前面创建的 query
。
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final query = FirebaseFirestore.instance
.collection('posts')
.orderBy('timestamp', descending: true);
return Scaffold(
appBar: AppBar(
title: Text('Firestore Pagination'),
),
body: PaginatedPosts(query: query),
);
}
}
3. 高级配置
PaginateFirestorePlus
提供了多种配置选项,以下是一些常用的配置:
itemBuilderType
: 指定列表的类型,可以是ListView
、GridView
或SliverList
。itemsPerPage
: 每页加载的文档数量。isLive
: 是否实时监听数据变化,如果为true
,则会实时更新数据。onLoaded
: 当一页数据加载完成时的回调。onError
: 当加载数据出错时的回调。shrinkWrap
: 是否使用shrinkWrap
属性,通常用于嵌套的ListView
。padding
: 列表的内边距。
4. 处理分页状态
PaginateFirestorePlus
会自动处理分页状态,包括加载更多数据和显示加载指示器。你还可以通过自定义加载指示器和空状态来提升用户体验。
PaginateFirestorePlus(
itemBuilderType: PaginateBuilderType.listView,
itemBuilder: (context, documentSnapshot, index) {
final post = documentSnapshot[index].data() as Map<String, dynamic>;
return ListTile(
title: Text(post['title']),
subtitle: Text(post['content']),
);
},
query: query,
itemsPerPage: 10,
isLive: true,
initialLoader: Center(child: CircularProgressIndicator()), // 初始加载指示器
bottomLoader: Center(child: CircularProgressIndicator()), // 底部加载指示器
emptyDisplay: Center(child: Text('No posts found')), // 空状态
);