Flutter分页加载Firestore数据插件flutterflow_paginate_firestore的使用

Flutter分页加载Firestore数据插件flutterflow_paginate_firestore的使用

设置

使用与cloud_firestore包相同的设置(或遵循此链接)。

使用

在你的pubspec.yaml文件中添加依赖:

dependencies:
  paginate_firestore: # 最新版本

导入插件:

import 'package:paginate_firestore/paginate_firestore.dart';

实现分页加载:

PaginateFirestore(
  // item builder类型是必须的。
  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'),
  // 更改类型以适应需求
  itemBuilderType: PaginateBuilderType.listView,
  // 获取实时数据
  isLive: true,
),

使用监听器:

PaginateRefreshedChangeListener refreshChangeListener = PaginateRefreshedChangeListener();

RefreshIndicator(
  child: PaginateFirestore(
    itemBuilder: (context, documentSnapshots, index) => ListTile(
      leading: const 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;
  },
)

贡献

如果您发现了一个bug或者想要一个功能,但不知道如何修复或实现它,请填写一个问题。 如果您修复了一个bug或实现了某个功能,请发送一个拉取请求

开始

这个项目是一个Dart的库模块,可以轻松地在多个Flutter或Dart项目中共享。

参与者 ✨

感谢以下贡献者:

贡献者姓名 贡献类型
Adam Dupuis 代码
Gautham 代码
Hafeez Ahmed 代码
Claudemir Casa 代码
Nikhil27bYt 文档
Ferri Sutanto 代码
jslattery26 代码
garrettApproachableGeek 代码
Sua Música 代码
Austin Nelson 代码

本项目遵循了all-contributors规范。任何形式的贡献都欢迎!


示例代码

example/lib/main.dart

import 'package:example/firebase_options.dart';
import 'package:flutter/material.dart';
import 'package:paginate_firestore/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(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  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数据插件flutterflow_paginate_firestore的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter分页加载Firestore数据插件flutterflow_paginate_firestore的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutterflow_paginate_firestore 是一个用于在 Flutter 应用中实现分页加载 Firestore 数据的插件。它可以帮助你轻松地实现分页功能,特别是在处理大量数据时,避免一次性加载所有数据,从而提高应用的性能。

安装插件

首先,你需要在 pubspec.yaml 文件中添加 flutterflow_paginate_firestore 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutterflow_paginate_firestore: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

使用插件

下面是一个简单的示例,展示如何使用 flutterflow_paginate_firestore 插件来实现分页加载 Firestore 数据。

1. 引入插件

import 'package:flutter/material.dart';
import 'package:flutterflow_paginate_firestore/flutterflow_paginate_firestore.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

2. 创建分页加载的 Widget

class PaginatedFirestoreList extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return PaginateFirestore(
      // Firestore 查询
      query: FirebaseFirestore.instance.collection('your_collection').orderBy('created_at'),
      // 每页加载的文档数量
      itemsPerPage: 10,
      // 列表项构建器
      itemBuilder: (context, documentSnapshot, index) {
        final data = documentSnapshot.data() as Map<String, dynamic>;
        return ListTile(
          title: Text(data['title']),
          subtitle: Text(data['description']),
        );
      },
      // 加载更多时的指示器
      footer: PaginateLoadingIndicator(
        height: 50,
        width: 50,
        indicatorType: IndicatorType.circle,
      ),
      // 空数据时的显示
      emptyDisplay: Center(
        child: Text('No data found.'),
      ),
      // 是否使用 SliverList
      isLive: true,
    );
  }
}

3. 在应用中使用分页加载的 Widget

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Paginated Firestore List'),
        ),
        body: PaginatedFirestoreList(),
      ),
    );
  }
}

void main() => runApp(MyApp());
回到顶部