[英]How to have multiple app-wise streams in flutter, when one stream depends on the other?
我有两个流,我需要在应用程序方面使用它们的数据。
我的主要障碍是其中一个流需要另一个流的数据,因此,我不能调用MultiProvider
。
我当前的实现如下所示,但我不喜欢它:我认为返回多个 MaterialApp 是不行的。 实际上,当从一个 MaterialApp 更改为另一个时,我的应用会变黑一段时间。
这是我目前的实现:
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<User>.value( //First, listen to the User Stream here
value: AuthService().user,
child: MyMaterialApp(),
);
}
}
class MyMaterialApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context); //To get the user data here, and use it bellow
if (user == null){ //If I don't have the User yet, return Loading()
return MaterialApp(
debugShowCheckedModeBanner: false,
title: "myApp",
theme: myTheme(),
home: Loading(),
);
} else {
return StreamProvider<UserData>.value(
value: DatabaseService(uid: user.uid).userData, //Once I have it, use it to build the UserData Stream
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: "myApp",
theme: myTheme(),
home: Wrapper(),
initialRoute: '/',
routes: {
'/home': (context) => Wrapper(),
//...
}
),
);
}
}
}
非常感谢!
基于这篇文章https://github.com/rrousselGit/provider/issues/222我能够通过执行以下操作来解决它:
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
StreamProvider<User>.value(value: AuthService().user),
Consumer<User>(
builder: (context, user, child) => StreamProvider<UserData>.value(
value: DatabaseService(uid: user == null ? null : user.uid).userData,
child: child,
),
)
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: "myApp",
theme: myTheme(),
home: Wrapper(),
initialRoute: '/',
routes: {
'/home': (context) => Wrapper(),
//...
}
),
);
}
}
Consumer
监听用户数据并将其传递给下一个 Stream。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.