Я учу 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;