【问题标题】:How to listen for document changes in Cloud Firestore using Flutter?如何使用 Flutter 监听 Cloud Firestore 中的文档更改?
【发布时间】:2018-11-01 10:28:04
【问题描述】:

我想要一个侦听器方法,如果发生更改,它会检查对文档集合的更改。

类似:

import 'package:cloud_firestore/cloud_firestore.dart';


  Future<Null> checkFocChanges() async {
    Firestore.instance.runTransaction((Transaction tx) async {
      CollectionReference reference = Firestore.instance.collection('planets');
      reference.onSnapshot.listen((querySnapshot) {
        querySnapshot.docChanges.forEach((change) {
          // Do something with change
        });
      });
    });
  }

这里的错误是onSnapshot 没有在CollectionReference 上定义。

有什么想法吗?

【问题讨论】:

    标签: dart google-cloud-firestore flutter


    【解决方案1】:

    通读cloud_firestore's documentation可以看到Query中的Stream可以通过snapshots()获得。

    为了您的理解,我将稍微转换一下您的代码:

    CollectionReference reference = Firestore.instance.collection('planets');
    reference.snapshots().listen((querySnapshot) {
      querySnapshot.documentChanges.forEach((change) {
        // Do something with change
      });
    });
    

    您也不应该在事务中运行它。 Flutter 方式是使用StreamBuilder,直接来自cloud_firestore Dart pub page

    StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection('books').snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (!snapshot.hasData) return new Text('Loading...');
        return new ListView(
          children: snapshot.data.documents.map((DocumentSnapshot document) {
            return new ListTile(
              title: new Text(document['title']),
              subtitle: new Text(document['author']),
            );
          }).toList(),
        );
      },
    );
    

    如果你想知道更多,你可以take a look at the source,它有据可查,这里不是不言自明的。

    还请注意,我将 docChanges 更改为 documentChanges。您可以在query_snapshot file 中看到这一点。如果您使用的是 IntelliJ 或 Android Studio 之类的 IDE,也很容易点击其中的文件。

    【讨论】:

    • 谢谢。我在 planets 上监听更改的原因是如果发生更改,则执行一些逻辑,而不仅仅是在视图中显示结果。
    • flutter 中我应该把checkForChanges() 放在哪里,以便在firebase 更改时触发它?我在想initState 覆盖。
    • @Patrioticcow 是的,为什么不呢? query.snapshots() Stream 上的 listen 函数将在更改时触发。
    • 这将在每次小部件重建时触发。你能告诉我应该如何防止这种情况发生并且仍然能够使用快照监听器,这样我就不会丢失实时更新? @creativecreatorormaybenot
    • 对集合的单个添加操作是下载整个集合(计费)还是插件仅通过修改它可能在内部存储的列表来在内部处理它?
    猜你喜欢
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2020-07-10
    • 2020-07-24
    • 2019-05-24
    • 2020-03-17
    • 2020-07-02
    相关资源
    最近更新 更多