Firestore Получение отдельных обновлений после запроса с помощью Dart - PullRequest
0 голосов
/ 12 февраля 2019

Я все еще изучаю Дарт / Флаттер, поэтому у меня есть концептуальный вопрос.Если я запускаю запрос, который возвращает мне 5 документов, как я могу настроить прослушиватели обновлений для каждого отдельного документа, чтобы при обновлении одного мне не приходилось повторять запрос и получать все 5 заново?По сути, я хочу индивидуальные обновления, а не групповые, когда фактически изменилось только одно.

Вот мой текущий код запроса, который прослушивает обновления, но тратит много чтения Firestore.

Firestore.instance
    .collection("lists")
    .where("users", arrayContains: uid)
    .snapshots()
    .listen((data) =>
        lists = Map.fromEntries(data.documents.map((DocumentSnapshot doc) {
          return MapEntry(doc.documentID, TaskList.fromSnapshot(doc));
        })));

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Из этого ответа мы можем понять, что вызов .snapshots() возвращает объект Stream, чего мы и хотим.Это будет возможно из запросов, ссылок на коллекции и ссылок на документы.Вам понадобится позже.

Во-первых, сохраните ссылку на каждый документ в самой модели, добавьте ее также в конструкторы, чтобы вы всегда могли передать ее при создании объектов из DocumentSnapshot, напримерthis:

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

   ...
} 

Теперь для каждого документа вы будете использовать ссылочный атрибут, получать моментальные снимки и прослушивать этот поток:

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);
0 голосов
/ 12 февраля 2019

Только обновленные документы обычно будут перечитываться с сервера.Другие (не обновленные) документы обычно читаются из локального кэша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...