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

Posted

技术标签:

【中文标题】在小部件构建期间如何在颤动中导航?【英文标题】:How to navigate in flutter during widget build? 【发布时间】:2020-05-05 07:54:27 【问题描述】:

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

  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 小部件,因为父小部件包含应用栏和浮动按钮,并且登录视图需要在没有这些控件的情况下显示。我需要导航。

有可能吗?

【问题讨论】:

用户如何登录?是火力基地吗? 【参考方案1】:

将其包裹在Future.microtask 中。这将安排它在下一个异步任务周期发生(即在build 完成之后)。

Future.microtask(() => Navigator.push(
  context, 
  MaterialPageRoute(builder: (context) => LoginView())
));

【讨论】:

但是在这种情况下,我有一个无限循环。有没有其他方法可以做到这一点? @Valaryo Future.microtask 只触发一次,所以如果你做得对,循环是不可能的。我可以想象这导致无限循环的唯一方法是,如果您使用它来导航到您已经在的页面并且加载页面是触发导航的原因。还可能存在一个问题,如果您在 build 方法期间尝试导航并且小部件正在重建多次,那么您将在第一个导航已经触发后继续排队。 (这就是为什么在 build 方法中做非 UI 的东西通常是个坏主意。) 是的,显然我确实做错了。我现在对此非常确定。我刚刚开始使用 Flutter。我已经尝试了所有可能的方法来实现这一点,但我要么遇到与 SetState 相关的错误,要么遇到与此相关的错误,或者与 MediaQuery 相关的错误。简而言之,我有一个包含三个组件的包装器:页眉、页脚和 viewWrapper(带有页面视图)。在这里你是对的。我正在滚动页面,我的最后一页是一个登录小部件,但到达它后我想退出 pageView 模式(我有页脚和页眉) 然后我尝试重定向到登录页面以使其全屏并有点静态。但是我的登录不在登录页面上,但我已经尝试放入内部页脚和***包装器。 我使用Provider来观察状态。您对我如何解决它有任何想法吗?【参考方案2】:

flutter 中的流

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

【讨论】:

【参考方案3】:

这里有问题:

snapshot.hasError && _isAuthenticationError(snapshot.error)

而不是这个使用 OR

snapshot.hasError || _isAuthenticationError(snapshot.error)

【讨论】:

以上是关于在小部件构建期间如何在颤动中导航?的主要内容,如果未能解决你的问题,请参考以下文章

在小部件测试期间检查颜色?

在颤动中使用来自不同小部件的命名导航器?

如何在小部件测试期间存根不属于类的函数?

如何在颤动中加载主小部件之前显示加载小部件?

如何在颤动中使用流构建器刷新小部件

导航抽屉未在颤动中从 APPBar 小部件打开