Flutter 在小部件构建期间如何在颤振中导航?

Flutter 在小部件构建期间如何在颤振中导航?,flutter,dart,Flutter,Dart,我试图检测用户不再经过身份验证,并将用户重定向到登录。我就是这样做的 Widget build(BuildContext context) { return FutureBuilder( future: _getData(context), builder: (context, snapshot) { try { if (snapshot.hasError && _isAuthenticati

我试图检测用户不再经过身份验证,并将用户重定向到登录。我就是这样做的

  Widget build(BuildContext context) {
    return FutureBuilder(
        future: _getData(context),
        builder: (context, snapshot) {
          try {
            if (snapshot.hasError && _isAuthenticationError(snapshot.error)) {
                Navigator.push(context, MaterialPageRoute(builder: (context) => LoginView()));
            }
不幸的是,在构建时进行导航不起作用。它抛出了这个错误

flutter: setState() or markNeedsBuild() called during build.
flutter: This Overlay widget cannot be marked as needing to build because the framework is already in the
flutter: process of building widgets.  A widget can be marked as needing to be built during the build 
我不能只返回
LoginView
小部件,因为父小部件包含应用程序栏和浮动按钮,并且需要在没有这些控件的情况下显示登录视图。。我需要导航


可以这样做吗?

未来将其包装。微任务
。这将安排它在下一个异步任务周期发生(即
构建完成后)

Future.microtask(()=>Navigator.push(
上下文
MaterialPage路由(生成器:(上下文)=>LoginView()
));

气流摆动

通常的做法是使用发生用户更改的流。 当用户注销时,他会检测到该更改并将其指向另一个窗口

在此,我附上了比我试图解释的更多的信息:
这里的问题是:

snapshot.hasError && _isAuthenticationError(snapshot.error)
而不是使用或

snapshot.hasError || _isAuthenticationError(snapshot.error)

用户如何登录?是firebase的吗?但在这种情况下,我有一个无休止的循环。还有其他方法可以做到吗?@Valaryo
Future.microtask
只触发一次,所以如果你做得对,循环是不可能的。我能想象的唯一方法是,如果你用它导航到你已经在的页面,加载页面就是触发导航的原因。还可能存在这样一个问题,即如果您在
build
方法期间尝试导航,并且小部件多次重建,那么在第一次导航被触发后,您将继续排队导航。(这就是为什么在
build
方法中使用非UI内容通常是一个坏主意。)是的,显然我确实做得不对。我现在对此非常肯定。我刚开始和弗利特打交道。我已经尝试了所有可能的方法来实现这一点,但我要么遇到了与SetState相关的错误,要么出现了与SetState相关的错误,要么出现了与MediaQuery相关的错误。简而言之,我有一个包装器,它包含三个组件:页眉、页脚和一个viewWrapper(带有页面视图)。你说得对。我正在滚动页面,我的最后一个页面是一个登录小部件,但到达它后,我想退出pageView模式(在那里我有页脚和页眉),所以我尝试重定向到一个登录页面,让它全屏显示,有点静态。但我的登录名不在登录页面上,但我已经尝试在页脚和顶层包装中添加内容。我使用提供程序监视状态。你对我如何解决这个问题有什么想法吗?