Dart Rx удалить ждать - PullRequest
       23

Dart Rx удалить ждать

0 голосов
/ 19 марта 2020

Я учу rx / dart в данный момент. Но я борюсь. Есть ли способ сделать это свойство синхронизированным? await currentUser() заставляет меня сделать свойство async этим. Но мне нужен какой-то хак, потому что эту часть интерфейса я не могу изменить. И я не хочу использовать шаблон адаптера.

Свойство должно возвращать Stream<User>. Любой способ добиться этого?

Future<Stream<User>> get onUserOrAuthStateChanged async {
    return authentication.onAuthStateChanged
        .asyncMap<User>((authenticationUser) async {
      return await _retrieveUserFromAuthenticationUser(authenticationUser);
    }).concatWith([
      await currentUser() == null
          ? Stream.empty()
          : userRepository.getStream((await currentUser()).id).skip(1)
    ]);
  }

Редактировать: Также authenticationUser можно использовать вместо await currentUser(). Например:

Stream<User> get onUserOrAuthStateChanged {
        AuthenticationUser currentAuthenticationUser;
        return authentication.onAuthStateChanged
            .asyncMap<User>((authenticationUser) async {
          currentAuthenticationUser = authenticationUser;
          return await _retrieveUserFromAuthenticationUser(authenticationUser);
        }).concatWith([
          currentAuthenticationUser == null
              ? Stream.empty()
              : userRepository.getStream(currentAuthenticationUser.uid).skip(1)
        ]);
      }

При таком подходе я избавляюсь от asyn c, но currentAuthenticationUser всегда null, когда выполняется метод concatWith get, потому что назначение происходит не синхронизировано после concatWith currentAuthenticationUser = authenticationUser;

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Вот решение, которое я придумал:

Stream<User> get onUserOrAuthStateChanged {
    return authentication.onAuthStateChanged.switchMap((authenticationUser) =>
        authenticationUser == null
            ? Stream.value(null)
            : userRepository.getStream(authenticationUser.uid));
  }
0 голосов
/ 20 марта 2020

Вы можете использовать Stream.fromFuture() для преобразования Future в Stream.

Это некоторые параметры псевдокода, поскольку я не полностью знаю ваш код и не пытался его скомпилировать, Я просто набираю это здесь из памяти.

: userRepository.getStream((Stream.fromFuture(await currentUser())).id).skip(1)

: userRepository.getStream((Stream.fromFuture(currentUser().map((u) => u.id)))).skip(1)

...