Isa*_*aak 10 provider stream dart flutter
我正在使用提供程序包。在小部件树的根部,我有一个 multiprovider:
Widget build(BuildContext context) {
return MultiProvider(
providers: [
StreamProvider<FirebaseUser>.value(
value: FirebaseConnection.getAuthenticationStream()),
StreamProvider<User>.value(
value: FirebaseConnection.getUserStream(uid: ???))
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
initialRoute: LoginScreen.id,
onGenerateRoute: RouteGenerator.generateRoute,
),
);
}
Run Code Online (Sandbox Code Playgroud)
第一个 StreamProvider 提供来自 firebase_auth 的登录用户。第二个 StreamProvider 应该向该用户提供附加信息(存储在 users 集合中)。问题是要获得第二个流,我需要第一个流提供的 FirebaseUser 的 uid,但我不知道如何访问它。
嵌套 StreamProviders 不起作用,因为在第二个流中我只能访问构建方法的(错误)上下文(对于 Provider.of(context))
解决方案是将第二个流 (loggedInUserStream) 保存在状态中,并在第一个流 (authenticationStream) 发出新值(通过监听它)时更改它,如下面的代码所示:
class _FloatState extends State<Float> {
StreamSubscription<FirebaseUser> authenticationStreamSubscription;
Stream<User> loggedInUserStream;
StreamSubscription<FirebaseUser> setLoggedInUserStream() {
authenticationStreamSubscription =
FirebaseConnection.getAuthenticationStream().listen((firebaseUser) {
loggedInUserStream =
FirebaseConnection.getUserStream(uid: firebaseUser?.uid);
});
}
@override
void initState() {
super.initState();
authenticationStreamSubscription = setLoggedInUserStream();
}
@override
void dispose() {
super.dispose();
authenticationStreamSubscription.cancel();
}
@override
Widget build(BuildContext context) {
return StreamProvider<User>.value(
value: loggedInUserStream,
child: MaterialApp(
debugShowCheckedModeBanner: false,
initialRoute: LoginScreen.id,
onGenerateRoute: RouteGenerator.generateRoute,
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
我只需要第一个流 (authenticationStream) 来获取第二个流 (loggedInUserStream),因此我没有将其提供给下面的小部件。
归档时间: |
|
查看次数: |
2293 次 |
最近记录: |