Flutter 颤振:从StreamBuilder回调内部导航到另一个屏幕
我有一个启动屏幕和一个Flutter 颤振:从StreamBuilder回调内部导航到另一个屏幕,flutter,stream-builder,Flutter,Stream Builder,我有一个启动屏幕和一个StreamBuilder,它发出一个包含身份验证状态信息的状态。当身份验证状态已知时,我希望导航到登录页或主页。但是当我写一些类似于Navigator.of(context).pushReplacement(…)的东西时,我得到了 I/颤振(2058):══╡ WIDGETS库捕获到异常╞═══════════════════════════════════════════════════════════ I/flatter(2058):在构建StreamBuilder时
StreamBuilder
,它发出一个包含身份验证状态信息的状态。当身份验证状态已知时,我希望导航到登录页或主页。但是当我写一些类似于Navigator.of(context).pushReplacement(…)
的东西时,我得到了
I/颤振(2058):══╡ WIDGETS库捕获到异常╞═══════════════════════════════════════════════════════════
I/flatter(2058):在构建StreamBuilder时抛出以下断言(脏,状态:
I/颤振(2058):_StreamBuilderBasState>#f4346):
I/flatter(2058):在生成过程中调用setState()或markNeedsBuild()。
I/flatter(2058):这个覆盖小部件不能被标记为需要构建,因为框架已经在
I/flatter(2058):构建小部件的过程。小部件可以标记为需要在构建阶段构建
I/Flatter(2058):仅当它的祖先之一正在建造时。此异常是允许的,因为框架
I/flatter(2058):在子部件之前构建父部件,这意味着将始终构建脏的子部件。
I/flatter(2058):否则,框架可能不会在构建阶段访问此小部件。
I/flatter(2058):调用setState()或markNeedsBuild()的小部件是:
I/颤振(2058):叠加-[LabeledGlobalKey#e0460](状态:叠加状态#ab1a5(条目:
I/flatter(2058):[OverlayEntry#4e962(不透明:假;维护状态:假),OverlayEntry#7656a(不透明:假;
I/颤振(2058):保持状态:真),过度进入#1f86e(不透明:假;保持状态:假),
I/颤振(2058):过度进入(05a15(不透明:假;保持状态:真)])
I/flatter(2058):当发出违规呼叫时,当前正在构建的小部件是:
I/颤振(2058):StreamBuilder(脏,状态:_StreamBuilderBasState>#f4346)
I/颤振(2058):
I/flatter(2058):抛出异常时,这是堆栈:
I/颤振(2058):#0元素。标记需要构建。(包:flatter/src/widgets/framework.dart:3503:11)
I/flatter(2058):#1 Element.markNeedsBuild(包:flatter/src/widgets/framework.dart:3529:6)
I/flatter(2058):#2 State.setState(包:flatter/src/widgets/framework.dart:1133:14)
I/flatter(2058):#3 overlystate.insertAll(包:flatter/src/widgets/overlay.dart:346:5)
I/flatter(2058):#4 OverlayRoute.install(包:flatter/src/widgets/routes.dart:43:24)
I/flatter(2058):#5 TransitionRoute.install(包:flatter/src/widgets/routes.dart:180:11)
I/flatter(2058):#6 ModalRoute.install(包:flatter/src/widgets/routes.dart:895:11)
I/flatter(2058):#7 NavigatorState.pushReplacement(包:flatter/src/widgets/navigator.dart:1799:14)
I/flatter(2058):#8(包:地图(聊天/应用/导航。dart:75:27)
I/flatter(2058):#9 _SignInPage.replace(包:map_chat/application/navigation.dart:67:5)
I/flatter(2058):#10 Roadmap.replace(包:map\u chat/application/navigation.dart:25:18)
I/flatter(2058):#11 SplashPageState.buildPageBasedOnAuthenticationState(包:map\u chat/feature/splash.dart:52:19)
I/flatter(2058):#12 SplashPageState.buildSplashScreen(软件包:map_chat/feature/splash.dart:40:11)
I/颤振(2058):#13"状态。"构建页面。(套餐:map_chat/feature/splash.省道:27:18)
I/flatter(2058):#14 StreamBuilder.build(包:flatter/src/widgets/async.dart:425:74)
I/flatter(2058):#15_StreamBuilderBaseState.build(包:flatter/src/widgets/async.dart:125:48)
I/flatter(2058):#16 StatefulElement.build(包:flatter/src/widgets/framework.dart:3825:27)
I/flatter(2058):#17 ComponentElement.performRebuild(包:flatter/src/widgets/framework.dart:3739:15)
I/flatter(2058):#18 Element.rebuild(包:flatter/src/widgets/framework.dart:3565:5)
I/flatter(2058):#19 BuildOwner.buildScope(包:flatter/src/widgets/framework.dart:2278:33)
I/flatter(2058):#20#WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&renderbinding&WidgetsBinding.drawFrame(包:flatter/src/widgets/binding.dart:700:20)
I/flatter(2058):WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&renderbinding.\u handlePersistentFrameCallback(包:flatter/src/rendering/binding.dart:286:5)
I/flatter(2058):#22"WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding."invokeFrameCallback(包:flatter/src/scheduler/binding.dart:1012:15)
I/flatter(2058):#23#WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame(包:flatter/src/scheduler/binding.dart:952:9)
I/flatter(2058):#24#WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.scheduleWarmUpFrame。(包:颤振/src/scheduler/binding.dart:773:7)
I/flatter(2058):#33 _计时器。_运行计时器(dart:isolate patch/Timer_impl.dart:382:19)
I/flatter(2058):#34 _Timer._handleMessage(dart:隔离补丁/定时器_impl.dart:416:5)
I/flatter(2058):#35 RawReceivePortImpl.handleMessage(dart:isolate patch/isolate_patch.dart:171:12)
I/flatter(2058):(从包dart:async和包dart:async补丁中删除8帧)
我找到的唯一解决办法是使用
Future(…)将导航安排到事件队列的末尾。然后(导航)
,但这很糟糕。这里有足够的解决方案吗?您可以在构建方法之外监听流,然后从那里重定向到另一个视图
----
@override
void initState() {
super.initState();
Future.delayed(Duration.zero, _verify);
}
void _verify() {
final _myBloc = BlocProvider.getBloc<MyBloc>();
_myBloc.myStream.listen((data) {
// Redirect to another view, given your condition
if (data) {
Navigator.of(context).pushNamed("my-new-route");
}
});
}
if(snapshot.hasdata && snapshot.data.navigate) {
Future.microtask(() => Navigator.of(context).push... );
}