gpt4 book ai didi

flutter - Riverpod:有没有正确的方法来读取另一个StreamProvider中的StreamProvider?

转载 作者:行者123 更新时间:2023-12-03 04:09:53 25 4
gpt4 key购买 nike

我一直在尝试使用从我的auth Provider获得的uid创建流到Firestore文档的流:

class AuthService {
...

static final provider = StreamProvider.autoDispose((ref) => FirebaseAuth.instance.onAuthStateChanged);
...
}
但是,我正在努力根据auth StreamProvider的值实际创建一个 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(回想起来很有意义)。
This question与该主题最相关,但它与提供程序(而不是Riverpod)打交道。
附言可以创建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,它将更新流,但是在发生更多auth事件时,仅触发侦听器,并且 await for loop不会捕获任何事件。
有趣的是,使用flutter检查器,auth提供程序发出的值永远不会更改,或者: AutoDisposeStreamProvider<FirebaseUser>#95f11: AsyncValue<FirebaseUser>.data(value: FirebaseUser(Instance of 'PlatformUser'))通过登录/注销事件仍然存在,这可以解释这种现象,但是我不确定该如何解决。
有任何想法吗?我已经坚持了一段时间,无法解决问题。

最佳答案

问题是,您的提供商没有创建Stream<User>,而是创建Stream<Stream<User>>作为0.6.0-dev的一部分,您可以使用ref.watch轻松组合流:

class User {
...
static final provider = StreamProvider((ref) {
final auth = ref.watch(AuthService.provider);
return Service.user.stream(auth.uid);
});
...
}

关于flutter - Riverpod:有没有正确的方法来读取另一个StreamProvider中的StreamProvider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62900521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com