Dart 如何使用flatter在CloudFireStore中侦听文档更改?

Dart 如何使用flatter在CloudFireStore中侦听文档更改?,dart,google-cloud-firestore,flutter,Dart,Google Cloud Firestore,Flutter,我希望有一个侦听器方法,在发生更改时检查文档集合的更改 比如: import 'package:cloud_firestore/cloud_firestore.dart'; Future<Null> checkFocChanges() async { Firestore.instance.runTransaction((Transaction tx) async { CollectionReference reference = Firestore.ins

我希望有一个侦听器方法,在发生更改时检查文档集合的更改

比如:

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
        });
      });
    });
  }
import'包:cloud_firestore/cloud_firestore.dart';
Future checkFocChanges()异步{
Firestore.instance.runTransaction((事务发送)异步{
CollectionReference=Firestore.instance.collection('planets');
reference.onSnapshot.listen((querySnapshot){
querySnapshot.docChanges.forEach((更改){
//做些改变
});
});
});
}
这里的错误是,
onSnapshot
未在
CollectionReference
上定义

有什么想法吗?

通读一遍,您可以看到来自
查询的
流可以通过
快照()
获得

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

CollectionReference reference = Firestore.instance.collection('planets');
reference.snapshots().listen((querySnapshot) {
  querySnapshot.documentChanges.forEach((change) {
    // Do something with change
  });
});
您也不应该在事务中运行此操作。颤振实现这一点的方法是使用
StreamBuilder
,直接从:

StreamBuilder(
流:Firestore.instance.collection('books').snapshots(),
生成器:(BuildContext上下文,异步快照){
如果(!snapshot.hasData)返回新文本('Loading…');
返回新的ListView(
子项:snapshot.data.documents.map((DocumentSnapshot文档){
返回新的ListTile(
标题:新文本(文件['title']),
副标题:新文本(文档['author']),
);
}).toList(),
);
},
);
如果你想知道更多,你可以,它有很好的文档记录,在那里它不是不言自明的


还要注意,我将
docChanges
更改为
documentChanges
。你可以在照片上看到。如果您使用的是IntelliJ或Android Studio等IDE,也可以很容易地点击其中的文件。

谢谢。我在
planets
上监听更改的理由是,如果某些内容发生更改,则执行一些逻辑,而不仅仅是在视图中显示结果。在
flatter
中,我将把
checkForChanges()
放在哪里,以便在firebase更改时触发它?我想在
initState
覆盖中。@Patrioticcow是的,为什么不呢?
query.snapshots()
流上的
listen
函数将在更改时触发。@creativecreatormormaybeno请告诉我,如何取消此订阅?将其分配给流订阅并取消它不起作用,snapshots.listen()仍在运行这将在每次小部件重建时触发。您能告诉我如何防止这种情况发生,并且仍然能够使用快照侦听器,以便不丢失实时更新吗@肌性呼吸暂停
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(),
    );
  },
);