Я пытался создать потоки в документы Firestore, используя uid , полученный из моего auth Provider
:
class AuthService {
...
static final provider = StreamProvider.autoDispose((ref) => FirebaseAuth.instance.onAuthStateChanged);
...
}
Однако я изо всех сил пытаюсь создать StreamProvider
в зависимости от значения из auth Provider
.
class User {
...
static final provider = StreamProvider((ref) {
final stream = ref.read(AuthService.provider);
// Returns AsyncValue<Stream<User>> instead of desired AsyncValue<User>
return stream.map((auth) => Service.user.stream(auth.uid));
});
...
}
Я также пробовал использовать Computed
для возврата uid или самого потока, но вы не можете прочитать Computed
из Provider
(что имеет смысл в ретроспективе).
Этот вопрос является наиболее актуальным в этом топе c, но он касается провайдера, а не Riverpod.
PS Можно ли создать тег Riverpod?
Изменить:
Ответ работает не совсем правильно. await for loop
запускается только один раз, тогда как слушатель улавливает все события.
static final provider = StreamProvider((ref) async* {
final stream = ref.read(AuthService.provider);
print('userProvider init');
stream.listen((auth) {
print('LISTENED: ${auth?.uid}');
});
await for (final auth in stream) {
print('uid: ${auth?.uid}');
yield* Service.user.stream(auth?.uid);
}
});
Этот код при входе в систему дает следующее:
userProvider init
LISTENED: <redacted UID>
uid: <redacted UID>
И затем при выходе из системы:
LISTENED: null
Там, где я ожидал бы увидеть uid: null
, который обновит поток, но при любых дополнительных событиях аутентификации запускается только слушатель, и никакие события не перехватываются await for loop
.
Интересно, что при использовании инспектора флаттера значение, выдаваемое провайдером аутентификации, никогда не меняется:
AutoDisposeStreamProvider<FirebaseUser>#95f11: AsyncValue<FirebaseUser>.data(value: FirebaseUser(Instance of 'PlatformUser'))
сохраняется через события входа / выхода , который мог бы объяснить такое поведение, но я не уверен, что делать, чтобы исправить это.
Есть идеи? Я застрял на этом некоторое время и не могу исправить проблему.