仅监听文档中的更改,而不是一直监听

问题描述 投票:0回答:2

我只想监听firebase中文档的更改,但现在似乎它每时每刻都在监听,尽管没有任何更改。我可以看到这一点,因为当我将其打印到控制台时,它永远不会停止。

FirebaseFirestore.instance
    .collection('users')
    .doc(user.uid)
    .snapshots()
    .listen((DocumentSnapshot documentSnapshot) {

  Map firestoreInfo = documentSnapshot.data();
  setState(() {
    name = firestoreInfo['name'];
  });
});

有人可以帮忙吗?另外,似乎没有“documentChanges”方法对我来说可以调用文档快照数据。

firebase flutter google-cloud-firestore
2个回答
4
投票

当您将侦听器附加到 Firestore 时,它最初会使用数据库中文档的当前值触发。然后,只要文档发生更改,它就会触发。无法跳过侦听器的初始值。

获得所需行为的常见方法是:

  1. 在用户文档中存储
    lastUpdated
    时间戳字段。
  2. 使用查询仅返回
    lastUpdated
    在“now”之后的文档。
  3. 要对具有特定 ID 的文档执行此类查询,您需要在
    FieldPath.documentId
    上使用条件。

0
投票

如果使用 QuerySnapshot 就可以实现这一点

有一个 DocumentChange,它具有更改的属性。

请参阅 firebase 文档

修改文档有更改类型 -

docChange.Type == DocumentChangeType.modified

您可以使用-

查看文档的新值
 docChange.document

代码-

  Query query = FirebaseFirestore.instance
    .collection('users')
    .where("userId", isEqualTo: user.uid)
    .limit(1)

  query.snapshots().listen((QuerySnapshot<Object?> event) {
    for (var change in event.docChanges) {
      if (change.doc.data() != null  && change.type == DocumentChangeType.modified){
        print('Document data: ${change.doc.data()}');
      } else {
        print('Document does not exist');
      }
    }
  });
© www.soinside.com 2019 - 2024. All rights reserved.