【发布时间】:2021-10-12 15:32:12
【问题描述】:
问题是我没有从 Authenticated 路由中的 StreamProviders(在全局级别定义)中获取任何值:
runApp(MultiProvider(
providers: [
Provider.value(value: userService),
StreamProvider.value(value: authService.userStream, initialData: null),
StreamProvider.value(value: userService.userDataStream),
StreamProvider.value(value: userService.characterStream),
],
child: MyApp(),
));
}
我注意到这与我的 Navigator 的逻辑有关(如果我删除它,提供程序值会按预期向下传递到小部件树)。我使用的 Navigator 基于应用程序具有 3 个状态的想法:Not Authenticated、Authenticated 和 Authenticated-First-Time。我得到了我是否从loginStream 认证的值(到目前为止一切正常):
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: loginStream,
builder: (ctx, snapshot) {
if (!snapshot.hasData) return Loading();
LoginState state = snapshot.data;
if (state == LoginState.LOGGED_OUT) return LoginScreen();
if (state == LoginState.FIRST_TIME) return CharacterCreationScreen();
return Navigator(
key: navigatorKey,
initialRoute: "/home",
onGenerateRoute: (settings) => PageRouteBuilder(
pageBuilder: (ctx, _, __) => routes(settings)(ctx),
transitionsBuilder: pageTransition,
),
);
},
);
问题是,如果我已通过身份验证并在 HomeScreen 中显示,那么即使有可用的实际数据,userDataStream 和 characterStream 都会返回 null。如果我删除 StreamBuilder + LoginLogic 本身并只返回上面的 Navigator 小部件,那么 HomeScreen 将获得正确的值。
更新: 我注意到它甚至不是 StreamBuilder。如果我在构建器中删除了 3 个 if,则流值会正确传播。不知道为什么会这样。
【问题讨论】: