我有两个流:
Stream<FirebaseUser> FirebaseAuth.instance.onAuthStateChanged
Stream<User> userService.streamUser(String uid)
我的 userService 需要经过身份验证的 FirebaseUser uid 作为参数。
由于我可能需要在应用程序的多个部分访问streamUser()流,因此我希望它成为我项目根部的提供者。
这就是我的 main.dart 的样子:
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
var auth = FirebaseAuth.instance;
var userService = new UserService();
return MultiProvider(
providers: [
Provider<UserService>.value(
value: userService,
),
],
child: MaterialApp(
home: StreamBuilder<FirebaseUser>(
stream: auth.onAuthStateChanged,
builder: (context, snapshot) {
if (!snapshot.hasData) return LoginPage();
return StreamProvider<User>.value(
value: userService.streamUser(snapshot.data.uid),
child: HomePage(),
);
}),
),
);
}
}
问题是,当我导航到不同的页面时,MaterialApp 下面的所有内容都会更改,并且我会丢失 StreamProvider 的上下文。
有没有办法将 StreamProvider 添加到 MultiProvider 提供程序列表中?
因为当我尝试时,我还必须为 FirebaseUser 创建另一个 onAuthStateChanged 流,并且我不知道如何将它们组合到一个提供程序中。
所以这似乎工作正常:
StreamProvider<User>.value(
value: auth.onAuthStateChanged.transform(
FlatMapStreamTransformer<FirebaseUser, User>(
(firebaseUser) => userService.streamUser(firebaseUser.uid),
),
),
),
如果有人在某些边缘情况下对此有疑问,请告诉我。
谢谢pskink https://stackoverflow.com/users/2252830/pskink有关提示flatMap https://pub.dev/documentation/rxdart/latest/rx/Observable/flatMap.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)