我一直在尝试使用从我的 auth 获得的uid创建流到 Firestore 文档的流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
从 a中读取 a Provider
(回想起来这很有意义)。
这个问题与这个主题最相关,但它涉及的是 Provider,而不是 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
.
有趣的是,使用颤振检查器,auth 提供者发出的值也永远不会改变:
AutoDisposeStreamProvider<FirebaseUser>#95f11: AsyncValue<FirebaseUser>.data(value: FirebaseUser(Instance of 'PlatformUser'))
通过登录/注销事件持续存在,这可以解释这种行为,但我不确定如何修复它。
有任何想法吗?我已经坚持了一段时间,无法纠正这个问题。