Зацикливание на изменении условий потока в Dart / Flutter / Firestore

#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 на высоком уровне?