Flutter: перейти к другому экрану из обратного вызова построителя StreamBuilder - PullRequest
0 голосов
/ 13 мая 2019

У меня есть заставка и StreamBuilder, который выдает состояние, которое содержит информацию о состоянии аутентификации. Когда статус аутентификации известен, я хочу перейти либо на страницу входа, либо на домашнюю страницу. Но когда я пишу что-то вроде Navigator.of(context).pushReplacement(...), я получаю

I / трепетание (2058): ══╡ ИСКЛЮЧЕНИЕ, ЗАПИСАННОЕ БИБЛИОТЕКОЙ ВИДЖЕТОВ ════════════════════════════ I / flutter (2058): было выброшено следующее утверждение при построении StreamBuilder (грязный, состояние: I / flutter (2058): _StreamBuilderBaseState> # f4346): I / flutter (2058): setState () или markNeedsBuild () вызывается во время сборки. I / flutter (2058): этот виджет «Наложение» нельзя пометить как необходимый для сборки, потому что фреймворк уже находится в I / flutter (2058): процесс создания виджетов. Виджет может быть помечен как необходимый для сборки на этапе сборки. I / flutter (2058): только если один из его предков в настоящее время строит. Это исключение разрешено, потому что рамки I / flutter (2058): создает родительские виджеты перед дочерними, что означает, что грязный потомок всегда будет построен. I / flutter (2058): В противном случае среда может не посетить этот виджет на этом этапе сборки. I / flutter (2058): виджет, для которого были вызваны setState () или markNeedsBuild (): I / flutter (2058): Overlay- [LabeledGlobalKey # e0460] (состояние: OverlayState # ab1a5 (записи: I / flutter (2058): [OverlayEntry # 4e962 (непрозрачный: false; keepState: false), OverlayEntry # 7656a (непрозрачный: false; I / flutter (2058): keepState: true), OverlayEntry # 1f86e (непрозрачный: false; keepState: false), I / flutter (2058): OverlayEntry # 05a15 (непрозрачный: false; keepState: true)])) I / flutter (2058): виджет, который в настоящее время создавался, когда был сделан вызывающий вызов: I / flutter (2058): StreamBuilder (грязный, состояние: _StreamBuilderBaseState> # f4346) I / флаттер (2058): I / flutter (2058): Когда было сгенерировано исключение, это был стек: I / flutter (2058): # 0 Element.markNeedsBuild. (Упаковка: трепетание / SRC / виджеты / framework.dart: 3503: 11) I / flutter (2058): # 1 Element.markNeedsBuild (пакет: flutter / src / widgets / framework.dart: 3529: 6) I / flutter (2058): # 2 State.setState (пакет: flutter / src / widgets / framework.dart: 1133: 14) I / flutter (2058): # 3 OverlayState.insertAll (пакет: flutter / src / widgets / overlay.dart: 346: 5) I / flutter (2058): # 4 OverlayRoute.install (пакет: flutter / src / widgets / rout.dart: 43: 24) I / flutter (2058): # 5 TransitionRoute.install (пакет: flutter / src / widgets / rout.dart: 180: 11) I / flutter (2058): # 6 ModalRoute.install (пакет: flutter / src / widgets / rout.dart: 895: 11) I / flutter (2058): # 7 NavigatorState.pushReplacement (пакет: flutter / src / widgets / navigator.dart: 1799: 14) I / flutter (2058): # 8 _replace (пакет: map_chat / application / navigation.dart: 75: 27) I / flutter (2058): # 9 _SignInPage.replace (пакет: map_chat / application / navigation.dart: 67: 5) I / flutter (2058): # 10 Roadmap.replace (пакет: map_chat / application / navigation.dart: 25: 18) I / flutter (2058): # 11 _SplashPageState._buildPageBasedOnAuthenticationState (пакет: map_chat / feature / splash.dart: 52: 19) I / flutter (2058): # 12 _SplashPageState._buildSplashScreen (пакет: map_chat / feature / splash.dart: 40: 11) I / flutter (2058): # 13 _SplashPageState._buildPage. (Упаковка: map_chat / особенность / splash.dart: 27: 18) I / flutter (2058): # 14 StreamBuilder.build (пакет: flutter / src / widgets / async.dart: 425: 74) I / flutter (2058): # 15 _StreamBuilderBaseState.build (пакет: flutter / src / widgets / async.dart: 125: 48) I / flutter (2058): # 16 StatefulElement.build (пакет: flutter / src / widgets / framework.dart: 3825: 27) I / flutter (2058): # 17 ComponentElement.performRebuild (пакет: flutter / src / widgets / framework.dart: 3739: 15) I / flutter (2058): # 18 Element.rebuild (пакет: flutter / src / widgets / framework.dart: 3565: 5) I / флаттер (2058): # 19BuildOwner.buildScope (пакет: flutter / src / widgets / framework.dart: 2278: 33) I / flutter (2058): # 20 _WidgetsFlutterBinding & BindingBase & GestureBinding & ServicesBinding & SchedulerBinding & PaintingBinding & SemanticsBinding & RendererBinding & WidgetsBinding.drawFrame (пакет: flutter / src / widgets / binding.dart: 700: 20) I / flutter (2058): # 21 _WidgetsFlutterBinding & BindingBase & GestureBinding & ServicesBinding & SchedulerBinding & PaintingBinding & SemanticsBinding & RendererBinding._handlePersistentFrameCallback (пакет: flutter / src / render / binding.dart: 286: 5) I / flutter (2058): # 22 _WidgetsFlutterBinding & BindingBase & GestureBinding & ServicesBinding & SchedulerBinding._invokeFrameCallback (пакет: flutter / src / scheduler / binding.dart: 1012: 15) I / flutter (2058): # 23 _WidgetsFlutterBinding & BindingBase & GestureBinding & ServicesBinding & SchedulerBinding.handleDrawFrame (пакет: flutter / src / scheduler / binding.dart: 952: 9) I / flutter (2058): # 24 _WidgetsFlutterBinding & BindingBase & GestureBinding & ServicesBinding & SchedulerBinding.scheduleWarmUpFrame. (Упаковка: трепетание / SRC / планировщик / binding.dart: 773: 7) I / flutter (2058): # 33 _Timer._runTimers (дартс: isolate-patch / timer_impl.dart: 382: 19) I / flutter (2058): # 34 _Timer._handleMessage (dart: isolate-patch / timer_impl.dart: 416: 5) I / flutter (2058): # 35 _RawReceivePortImpl._handleMessage (dart: isolate-patch / isolate_patch.dart: 171: 12) I / flutter (2058): (исключено 8 кадров из пакета dart: async и пакета dart: async-patch)

Единственный обходной путь, который я нашел, - это запланировать переход к концу очереди событий, используя Future(...).then(navigate), но это плохо. Здесь адекватное решение для этого?

1 Ответ

1 голос
/ 14 мая 2019

Вы можете прослушивать поток вне метода сборки и перенаправлять оттуда на другое представление.

...