Проблема в том, что я не получаю никаких значений от своих StreamProviders (которые определены на глобальном уровне) в моем маршруте Authenticated
:
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(),
));
}
Я заметил, что это связано с логикой моего навигатора (если я его удаляю, значения поставщика передаются вниз по дереву виджетов, как и ожидалось). Навигатор, который я использую, основан на идее, что приложение имеет 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,
),
);
},
);
Дело в том, что если я прошел аутентификацию и говорю на главном экране, то оба userDataStream
и characterStream
возвращают нуль, даже если доступны фактические данные. Если я удалю сам StreamBuilder + LoginLogic и просто верну виджет Navigator
выше, то HomeScreen получит правильные значения.
ОБНОВЛЕНИЕ: Я заметил, что это даже не StreamBuilder. Если я удалю 3 if в построителе, тогда значения потока будут распространяться правильно. Не уверен, почему это происходит.
Нет, это не помогает, к сожалению. Значения, которые я передаю, также уже инициализированы, что заставляет меня поверить, что
.value
в любом случае правильный путь. Хотя опять же, я пробовал, но не повезло