flutter - Flutter Provider:提供 2 个流,一个依赖另一个
问题描述
我正在使用提供程序包。在小部件树的根目录中,我有一个多提供者:
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,
),
);
}
第一个 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,
),
);
}
}
我只需要第一个流(authenticationStream)来获取第二个流(loggedInUserStream),所以我没有将它提供给下面的小部件。
推荐阅读
- laravel - 使用 Git 和 Github 更新 Laravel/Lumen API
- python - 如何高效快速地解析大量行格式json文件
- php - 如何以固定价格计算多个用户输入值?
- scala - 如何在另一个计算中重用队列?fs2 流 Scala
- r - R Shiny ggplot2 传单 - 如何在折线图的 X 轴上绘制多个字段
- javascript - 如何在更新状态 onChange 的 React 输入框中保持光标固定?
- python - 修复python中的小数点
- r - 减少 Shiny 中 fileInput 和文本之间的空间
- android - 当导航抽屉仍在工作时,使用左上角的后退箭头打开新片段或新活动
- java - 为什么使用 java.lang.ClassLoader.getResource 作为 jar 中的资源