如何在颤动中从导航器堆栈中弹出最后三个路由

Posted

技术标签:

【中文标题】如何在颤动中从导航器堆栈中弹出最后三个路由【英文标题】:How to pop last three routes from the navigator stack in flutter 【发布时间】:2020-05-09 19:24:30 【问题描述】:

场景

我正在将用户从应用程序中的不同屏幕(例如 destinationScreen、tractionScreens、reviewScreen 等)导航到 loginScreen/signUpScreen,并且在成功登录后,我想将他弹回从他导航到 loginScreen/ 的同一屏幕注册屏幕。

所以,我想弹出注册/登录过程中涉及的所有屏幕,比如 3 个屏幕

我已经尝试过的

我已经尝试过 navigator.popUntil,但它只有在你每次都想像这样弹回单个屏幕时才能工作:

推送路线:

Navigator.push(
  context,
  MaterialPageRoute(
    settings: RouteSettings(name: '/loginRedirect'),
      builder: (context) => AttractionScreen(
            attractionData: att,
          )),
);

signInScreen 中的弹出路由:

Navigator.popUntil(context, ModalRoute.withName('/loginRedirect'));

但这种情况仅在您必须路由到单个特定屏幕时才有效,但在我的情况下,我必须根据用户被引导到登录屏幕的位置路由到不同的屏幕。

我现在想做的事

现在我想要一个实现,在成功登录后,我从导航器堆栈中弹出前三个屏幕,我搜索了很多但找不到任何解决方案。 那么,如何从导航器堆栈中弹出最后一条路线?

【问题讨论】:

【参考方案1】:

我刚刚得到了一个我以前不确定的解决方案。

我只需要调用三遍:

Navigator.pop(context)

像这样:

if (needBackRedirect) 
    Navigator.of(context)..pop()..pop()..pop();

【讨论】:

【参考方案2】:

如果您想从导航堆栈中弹出 3 个屏幕,请取一个变量并跟踪已删除的路线。然后检查该计数是否达到 3,然后停止弹出路由。

    添加此变量:
   List<Route> arrayRoutes = [];
    将此添加到您要执行弹出逻辑的位置:
    Navigator.popUntil(context, (Route<dynamic> route)
                          arrayRoutes.add(route);
                          if (arrayRoutes.length != 3) 
                            print('continue popping if length is not 3');
                            return true;
                           else 
                            print('stop to pop when count is 3');
                            return false;
                          
                        ); 

【讨论】:

【参考方案3】:

只需在 main.dart(appRoutes) 文件中定义路由,使用导航器 pushNamed 方法在屏幕之间导航并弹出直到任意数量的屏幕只需使用 popUnti例如

Navigator.of(context).popUntil((route) 
               return route.settings.name ==
                          'RouteName'; // Use defined route like Dashboard.routeName
     );

【讨论】:

以上是关于如何在颤动中从导航器堆栈中弹出最后三个路由的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用导航栏的情况下从导航堆栈中弹出控制器

在导航控制器中弹出到根视图

从导航堆栈中弹出视图控制器时从右侧滑入

如何在颤动中弹出到特定屏幕

为啥从导航堆栈中弹出视图时键盘不显示?

有没有办法找出视图控制器是不是从导航堆栈中弹出?