Flutter实时分页Firestore插件ha_firestore_realtime_paginate的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter实时分页Firestore插件ha_firestore_realtime_paginate的使用

Flutter库用于基于屏幕尺寸显示实时分页列表视图或网格视图。

特性

  • Firestore 实时分页
  • 列表视图样式
  • 分组列表视图
  • 水流式网格视图样式

开始使用

pubspec.yaml 文件中添加依赖:

dependencies:
  ha_firestore_realtime_paginate: # 最新版本

使用示例

以下是一个完整的示例,展示了如何使用 ha_firestore_realtime_paginate 插件来实现实时分页功能:

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

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // 此小部件是您的应用程序的根。
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: HAFirestoreRealtimePaginatedView(
        style: ListViewStyle.auto,
        scrollPadding: const EdgeInsets.only(bottom: 90),
        query: FirebaseFirestore.instance
            .collection("users")
            .orderBy("addedDate", descending: true),
        limit: 10,
        groupBy: "addedDate",
        header: (groupFieldValue) {
          return Container(
            color: Colors.white,
            child: Text("$groupFieldValue"),
          );
        },
        builder: (context, snapshot) {
          Map<String, dynamic> data = snapshot.data() as Map<String, dynamic>;
          return ListTile(
            title: Text(data['name'] ?? "no name"),
          );
        },
        emptyWidget: const Center(
          child: Text("no data found"),
        ),
      ),
    );
  }
}

分组(粘性头部)

您可以使用 groupBy 字段和 header 小部件对列表进行分组。示例如下:

HAFirestoreRealtimePaginatedView(
  ...
  groupBy: "addedDate",
  header: (groupFieldValue) {
    return Container(
      color: Colors.white,
      child: Text("$groupFieldValue"),
    );
  },
  ...
)

过滤

您可以应用过滤器以排除某些文档。示例如下:

HAFirestoreRealtimePaginatedView(
  ...
  filter: (DocumentSnapshot a) {
    // 返回 true 表示包含此文档,返回 false 表示排除此文档
    return a.get('isDeleted') == false;
  },
  ...
)

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

1 回复

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


当然,下面是一个关于如何使用ha_firestore_realtime_paginate插件在Flutter中实现实时分页与Firestore集成的代码案例。这个插件允许你高效地加载和显示来自Firestore的分页数据,同时能够实时监听数据的变化。

首先,确保你已经在pubspec.yaml文件中添加了ha_firestore_realtime_paginate依赖:

dependencies:
  flutter:
    sdk: flutter
  ha_firestore_realtime_paginate: ^最新版本号  # 请替换为最新的版本号

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

接下来,在你的Flutter应用中,你可以按照以下步骤使用ha_firestore_realtime_paginate

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:ha_firestore_realtime_paginate/ha_firestore_realtime_paginate.dart';
  1. 初始化Firestore实例
final FirebaseFirestore firestore = FirebaseFirestore.instance;
  1. 创建分页控制器
class _MyHomePageState extends State<MyHomePage> {
  late FirestorePaginatorController<Map<String, dynamic>> _controller;

  @override
  void initState() {
    super.initState();
    _controller = FirestorePaginatorController<Map<String, dynamic>>(
      query: firestore.collection('your_collection_name').orderBy('your_order_field'),
      pageSize: 10, // 每页加载的数据数量
    );

    // 监听数据变化
    _controller.paginationStream.listen((paginationData) {
      setState(() {}); // 更新UI
    });
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
  1. 构建UI
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firestore Realtime Pagination'),
      ),
      body: _controller.paginationDataWhenLoaded?.isEmpty ?? true
          ? Center(child: CircularProgressIndicator())
          : ListView.builder(
              itemCount: _controller.paginationDataWhenLoaded!.length,
              itemBuilder: (context, index) {
                final document = _controller.paginationDataWhenLoaded![index];
                return ListTile(
                  title: Text(document['your_field_name']),
                  // 根据需要添加更多UI元素
                );
              },
            ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          await _controller.loadMore(); // 加载更多数据
        },
        tooltip: 'Load More',
        child: Icon(Icons.add),
      ),
    );
  }
}
  1. 完整的主文件
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:ha_firestore_realtime_paginate/ha_firestore_realtime_paginate.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Firestore Realtime Pagination Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late FirestorePaginatorController<Map<String, dynamic>> _controller;

  @override
  void initState() {
    super.initState();
    _controller = FirestorePaginatorController<Map<String, dynamic>>(
      query: firestore.collection('your_collection_name').orderBy('your_order_field'),
      pageSize: 10, // 每页加载的数据数量
    );

    // 监听数据变化
    _controller.paginationStream.listen((paginationData) {
      setState(() {}); // 更新UI
    });
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firestore Realtime Pagination'),
      ),
      body: _controller.paginationDataWhenLoaded?.isEmpty ?? true
          ? Center(child: CircularProgressIndicator())
          : ListView.builder(
              itemCount: _controller.paginationDataWhenLoaded!.length,
              itemBuilder: (context, index) {
                final document = _controller.paginationDataWhenLoaded![index];
                return ListTile(
                  title: Text(document['your_field_name']),
                  // 根据需要添加更多UI元素
                );
              },
            ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          await _controller.loadMore(); // 加载更多数据
        },
        tooltip: 'Load More',
        child: Icon(Icons.add),
      ),
    );
  }
}

在这个示例中,我们创建了一个FirestorePaginatorController,它管理从Firestore加载的数据。我们设置了分页大小(pageSize),并监听paginationStream来更新UI。当用户点击浮动操作按钮时,loadMore方法会被调用以加载更多数据。

请确保替换your_collection_nameyour_order_field以及your_field_name为你的实际Firestore集合名称、排序字段和要显示的字段。

回到顶部