使用Dart查询后,Firestore检索单个更新

时间:2019-02-12 00:16:30

标签: firebase dart flutter google-cloud-firestore

我仍在学习Dart / Flutter,所以我有一个概念性的问题。如果我运行的查询向我返回了5个文档,如何为每个单独的文档设置更新侦听器,这样在更新一个文档时,我不必重新运行查询并再次获取全部5个文档?基本上,当只有一个实际更改时,我希望进行单个更新而不是组更新。

这是我当前的查询代码,该更新侦听更新,但浪费了大量的Firestore读取内容。

a

2 个答案:

答案 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);