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

1 回复

更多关于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: 指定列表的类型,可以是 ListViewGridViewSliverList
  • 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')), // 空状态
);
回到顶部