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

  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块.这将安排它在下一个异步任务周期(即build完成之后)发生.

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

Dart相关问答推荐

有什么区别!并且 ! 在 Dart 中?

Dart 扩展: don't access members with "this" unless avoiding shadowing

在 Dart 的 Cloud Firestore 中添加文档后如何获取文档 ID

有没有办法在用户停止输入后发送请求?

如何在flutter中使用rootBundle加载图片?

如何用 Flutter 在同屏路由上制作英雄风格的动画?

从列表中删除项目后更新 UI

Flutter-创建一个倒计时(countdown)小部件

每次我按下导航项时,底部的导航栏都会重新加载所有小部件

找不到正确的提供程序-Flutter

Flatter Container()与SizedBox()的虚拟空容器

为什么我不能将数字转换为双精度数?

如何 Select 性地传递可选参数?

Flutter 错误:The _ScaffoldLayout custom multichild layout delegate forgot to lay out the following child

如何在Dart中处理JSON

如何在dart中获得一周的开始或结束

dart中的max/mi int/double 值是否有常数?

判断 datetime 变量是今天、明天还是昨天

dart 折叠(Fold)与减少(Reduce)

如何在 Dart 中将 double 转换为 int?