Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振:从StreamBuilder回调内部导航到另一个屏幕_Flutter_Stream Builder - Fatal编程技术网

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... );
   }