Как обеспечить выполнение FieldValue.serverTimestamp () fini sh в Cloud Firestore до того, как я получу последние данные о моем слушателе? - PullRequest
0 голосов
/ 10 июля 2020

Я кодирую во Flutter и обновляю документ в моем Cloud Firestore

// Prepare the data
final Map<String, dynamic> data = {
        'name': newName,
        'lastUpdate': FieldValue.serverTimestamp()
      };

// Update the data in Firestore
await documentReference.updateData(data);

У меня также есть подписка, которая прослушивает этот documentReference вот так:

subscription = documentReference
         .snapshots().listen((){});

subscription.onData(printSnapshotData);

Что происходит: я обновляю данные только один раз, но получаю два чтения данных на моем слушателе. Первый такой:

name: 'newName'
lastUpdated: null

Второй такой:

name: 'newName'
lastUpdated: Timestamp(seconds=1594368407, nanoseconds=376000000)

Таким образом, кажется, что была задержка между первым и вторым, и приложение получает данные дважды.

Я хочу получить данные после того, как будет выполнено Timestamp в поле lastUpdated. Достаточно прочитать только один раз, потому что первые данные мне бесполезны. Как это сделать?

Спасибо!

1 Ответ

3 голосов
/ 10 июля 2020

Тот факт, что вы получаете два обновления для вашего слушателя, является ожидаемым, и это поведение нельзя изменить. Слушатели всегда немедленно запускаются при локальных изменениях, а затем снова при каждом изменении данных. Поскольку SDK не знает окончательного значения временной метки до ее записи, он будет вызывать один раз без окончательного значения, а затем еще раз с последней временной меткой сервера. Первый обратный вызов не требует чтения документа - он работает исключительно с локальными данными.

Если вы хотите знать, исходит ли моментальный снимок, доставленный вашему обратному вызову, с сервера, вам нужно будет проверить данные в снимок, чтобы увидеть, содержит ли он то, что вам нужно.

Для получения более подробной информации о том, как работают временные метки сервера, прочтите это сообщение в блоге .

...