Flutter云数据库集成插件ha_firestore_scaffold的使用

Flutter云数据库集成插件ha_firestore_scaffold的使用

Firestore Scaffold

就像材料库中的Scaffold一样,Firestore Scaffold专门用于Firestore,它可以显示基于屏幕尺寸的实时分页列表视图或网格视图。你还可以根据查询添加搜索功能。

特性

  • 📱 Firestore Scaffold
  • 🔎 基于查询的搜索
  • 📈 Firestore 实时分页
  • 𝍌 列表视图样式
  • ⌗ 分组列表视图
  • 🌊 水流网格视图样式

开始使用

添加依赖

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

dependencies:
  ha_firestore_scaffold: # 最新版本

然后运行flutter pub get来获取最新的依赖。

使用方法

使用HAFirestoreScaffold作为普通的Scaffold来从Firestore查询中获取实时分页结果。

HAFirestoreScaffold(
  title: widget.title,
  query: FirebaseFirestore.instance
      .collection("users")
      .orderBy("addedDate", descending: true),
  limit: (deviceType) {
    return 50;
  },
  itembuilder: (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"),
  ),
)

搜索功能

你也可以在Scaffold中添加搜索功能,通过使用HAFirestoreSearch作为searchDelegate,其中searchField将是一个包含字符串数组的文档字段。

HAFirestoreSearch(
  firestoreQuery: FirebaseFirestore.instance
      .collection("users")
      .orderBy("addedDate", descending: true),
  searchField: 'keywords',
  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 search data found"),
  ),
)

分组(粘性头部)

你可以在HAFirestoreScaffold构造函数中传递groupBy字段和header小部件来对列表进行分组。

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

完整示例

以下是完整的示例代码,它展示了如何在Flutter应用中使用ha_firestore_scaffold插件。

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'HAFirestore Scaffold',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'HAFirestore Scaffold'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return HAFirestoreScaffold(
      title: widget.title,
      query: FirebaseFirestore.instance
          .collection("users")
          .orderBy("addedDate", descending: true),
      limit: (deviceType) {
        return 50;
      },
      groupBy: "addedDate",
      header: (groupFieldValue) {
        return Container(
          color: Colors.white,
          child: Text("$groupFieldValue"),
        );
      },
      itembuilder: (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"),
      ),
      searchDelegate: HAFirestoreSearch(
        firestoreQuery: FirebaseFirestore.instance
            .collection("users")
            .orderBy("addedDate", descending: true),
        searchField: 'keywords',
        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 search data found"),
        ),
      ),
    );
  }
}

更多关于Flutter云数据库集成插件ha_firestore_scaffold的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter云数据库集成插件ha_firestore_scaffold的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,ha_firestore_scaffold 是一个用于 Flutter 的插件,它可以帮助开发者快速集成 Firebase Firestore 数据库,并生成相应的 UI 组件。以下是一个使用 ha_firestore_scaffold 的基本示例代码,展示如何设置和使用这个插件。

首先,确保你已经在你的 Flutter 项目中添加了 ha_firestore_scaffold 依赖。打开你的 pubspec.yaml 文件,并添加以下依赖:

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

然后运行 flutter pub get 以获取依赖。

接下来,配置 Firebase Firestore。你需要在 Firebase 控制台中为你的应用创建项目,并启用 Firestore 数据库。然后,将生成的 google-services.json 文件(对于 Android)和 GoogleService-Info.plist 文件(对于 iOS)放到你的 Flutter 项目中相应的位置。

以下是使用 ha_firestore_scaffold 的示例代码:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  late Firestore firestore;

  @override
  void initState() {
    super.initState();
    firestore = FirebaseFirestore.instance;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firestore Scaffold Demo'),
      ),
      body: FirestoreScaffold(
        firestore: firestore,
        collectionName: 'your_collection_name', // 替换为你的集合名称
        documentIdFieldName: 'id', // 文档 ID 字段名称
        documentSnapshotToWidget: (documentSnapshot) {
          Map<String, dynamic> data = documentSnapshot.data()! as Map<String, dynamic>;
          return ListTile(
            title: Text(data['name']?.toString() ?? 'Unknown'),
            subtitle: Text(data['description']?.toString() ?? ''),
            trailing: IconButton(
              icon: Icon(Icons.delete),
              onPressed: () async {
                await firestore.collection('your_collection_name').doc(documentSnapshot.id).delete();
              },
            ),
          );
        },
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            // 添加新文档
            await firestore.collection('your_collection_name').add({
              'name': 'New Item',
              'description': 'This is a new item description',
            });
          },
          tooltip: 'Add',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

在这个示例中:

  1. FirestoreScaffoldha_firestore_scaffold 插件提供的一个组件,它接受几个参数来配置其行为。
  2. firestore 是 Firebase Firestore 的实例。
  3. collectionName 是你要查询的 Firestore 集合的名称。
  4. documentIdFieldName 是文档中存储 ID 的字段名称(通常可以省略,因为 Firestore 自动管理文档 ID)。
  5. documentSnapshotToWidget 是一个函数,它将 DocumentSnapshot 转换为 Flutter Widget。在这个例子中,它简单地显示文档中的 namedescription 字段。
  6. floatingActionButton 是一个浮动操作按钮,用于添加新文档到集合中。

请根据你的具体需求调整这个示例代码,比如更改集合名称、字段名称或者添加更多的字段到新文档中。

回到顶部