#flutter #dart #google-cloud-firestore
#флаттер #dart #google-облако-firestore
Вопрос:
Я хочу создать автономный кэш для Firestore, используя его потоковую возможность snapshots () для прослушивания только обновлений, дата изменения которых превышает дату изменения, хранящуюся в локальной базе данных. Однако каждое обновление необходимо будет выполнить один раз, а затем условие необходимо будет сбросить до последней локально сохраненной измененной даты.
На данный момент я как бы застрял на концепции потока, когда дело доходит до сброса его состояния при первом событии. Смотрите приведенный ниже код:
Stream<List<T>> watchAllForUser({
required String uid,
Duration purgeDuration = const Duration(days: 30),
}) async* {
// 1. At the start of watch session, purge data if possible
await _remoteProvider.purgeDeletesForUser(uid, purgeDuration);
// 2. Watch updates from remote
DateTime localTime = (await _localProvider.fetchLastModifiedForUser(uid));
Stream<List<T>> updateStream = _remoteProvider.watchUpdatesForUser(uid, localTime);
var update = await updateStream.first;
updateStream = _remoteProvider.watchUpdatesForUser(uid, localTime);
update = await updateStream.first;
yield update;
updateStream = _remoteProvider.watchUpdatesForUser(uid, localTime);
update = await updateStream.first;
yield update;
updateStream = _remoteProvider.watchUpdatesForUser(uid, localTime);
update = await updateStream.first;
yield update;
updateStream = _remoteProvider.watchUpdatesForUser(uid, localTime);
update = await updateStream.first;
// 3... and so on... obviously I need the above to be in a loop some how
// But I don't understand what is the loop condition here... is it an infinite loop?
// or something else to serve this purpose?
// 4. For each new update, upsert to local database and reset updateStream's condition
await for (final update in updateStream) {
updateStream
yield update;
}
Обратите внимание на две строки, в которых мне нужно повторить переназначение updateStream и каждый раз получать другой результат. По сути, я хочу следить за изменениями, но как только я получу эти изменения, мне нужно отключить поток и создать новый. Я попробовал метод await for, но он выполняет только цикл через начальный поток.
Обратите внимание, что я не могу использовать реализацию Firestore в формате changeDocs для отслеживания только изменений в одном потоке. Причина в том, что я пытаюсь сохранить эту реализацию как можно более независимой и абстрактной от других реализаций, на случай, если я захочу сменить поставщиков / источники в будущем.
Я на самом деле не привык к асинхронному программированию, поэтому это может быть просто простой вещью, которую я, возможно, упустил из виду. Любая помощь приветствуется.
Комментарии:
1. Знаете ли вы о встроенной возможности сохранения в автономном режиме в Firestore? Если да, является ли основной мотивацией для того, чтобы это решение работало для любой базы данных на основе документов NoSQL? — Подробнее остановитесь на этом утверждении » Обратите внимание на две строки, где мне нужно повторить переназначение updateStream и каждый раз получать другой результат. В принципе, я хочу следить за изменениями …» с примером, если это возможно. — Что происходит в watchUpdatesForUser на высоком уровне?