我仍在学习Dart / Flutter,所以我有一个概念性的问题。如果我运行的查询向我返回了5个文档,如何为每个单独的文档设置更新侦听器,这样在更新一个文档时,我不必重新运行查询并再次获取全部5个文档?基本上,当只有一个实际更改时,我希望进行单个更新而不是组更新。
这是我当前的查询代码,该更新侦听更新,但浪费了大量的Firestore读取内容。
a
答案 0 :(得分:0)
通常只有从服务器重新读取更新的文档。其他(未更新的)文档通常将从本地缓存中读取。
答案 1 :(得分:0)
从this answer,我们可以理解,调用.snapshots()
返回一个Stream
对象,这是我们想要的。这将可以通过查询,集合引用和文档引用来实现。您将需要后者。
首先,将每个文档的引用保存在模型本身中,并将其添加到构造函数中,以便在通过DocumentSnapshot
创建对象时始终可以传递它,如下所示:
import 'package:cloud_firestore/cloud_firestore.dart';
class TaskList {
/* attributes */
DocumentReference reference; //Add this
// If you followed the default firebase guide, you'll have the following methods.
// Add the reference to your constructors
TaskList.fromMap(Map<String, dynamic> map, {this.reference}) //add this reference
: //normal attribute initializations;
TaskList.fromSnapshot(DocumentSnapshot snapshot)
: this.fromMap(snapshot.data, reference: snapshot.reference); //add this reference as well
...
}
现在,对于每个文档,您将使用reference属性,获取快照,并收听此流:
TaskList taskList = TaskList.fromSnapshot(doc); //normal initialization
taskList.reference.snapshots().listen((updatedDoc){ //listen to the stream
print("Document was updated:");
print(updatedDoc.data);
// notice that this will return the first time with the object itself
// which can be resource consuming
});
return MapEntry(doc.documentID, taskList);