Navigator.popUntil flutter 显示黑屏

我的项目中有两个不同的流程。

  1. 主页 -> 页面A -> 页面B -> 页面C -> 页面A

从页面 C 到页面 A,我使用此代码,它工作正常。

   Navigator.popUntil(context, ModalRoute.withName(AssetMenu.ROUTE));

2.当收到推送通知时,用户点击推送通知,我希望它立即像这样导航

主页 -> 页面 B -> 页面 C -> 然后当点击页面 C 中的按钮时返回页面 A。

但是当点击页面C中的按钮时,它显示黑屏。

我该如何处理?

stack overflow Navigator.popUntil flutter show black screen
原文答案
author avatar

接受的答案

在您的第二个用例中,缺少 Page A 。当您调用 Navigator.popUntil() 时,导航器会在路由堆栈中向上并弹出它们,直到找到指定的路径。如果指定的路由不在堆栈上,它将删除路由,直到堆栈为空。这就是你得到黑屏的原因。

如果你想把 Main Page -> Page B -> Page C 变成 Main Page -> Page A ,你必须调用 Navigator.pushAndRemoveUntil() ,其中新路由是 Page A 并且谓词匹配 Main Page 。或者使用 Navigator.pushNamedAndRemoveUntil()


答案:

作者头像

也许你可以试试这个

Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) => AssetMenu(),), (route) => route.isFirst);
作者头像

我建议使用名称路由,即使您的应用程序随着页面的增加而变得更大,也更容易。我更喜欢让 main.dart 外部和 dart 内部的小部件只使用逻辑和路由,然后在创建你需要 A、B、C 的 3 个页面并设置你是第一页的主要 dart 代码之后(主页) 必须是 A 页。

继续你的页面,在 Statefull{ 或 Stateless { 下输入路由名称:

static const routeName = '/pageA';
static const routeName = '/pageB';
static const routeName = '/pageC';

在你的 main.dart 中定义路线:

home: WidgetFromPageA(),
      routes: {
        WidgetFromPageB.routeName: (ctx) => WidgetFromPageB(),
        WidgetFromPageC.routeName: (ctx) => WidgetFromPageC(),
        },

您可以从任何页面调用此操作:

Navigator.of(context).pushNamed(WidgetFromPageA.routeName);
Navigator.of(context).pushNamed(WidgetFromPageB.routeName);
Navigator.of(context).pushNamed(WidgetFromPageC.routeName);

通过这种方式,您可以转到页面 B 并在应用栏中的新页面上获得返回按钮。例如,当您在第二页时,使用 pushReplacement() 方法并打开第三页,当您点击后退按钮时,您将转到第一页并跳过第二页。

为了更清楚,您可以像这样导航到第四页:

[ 1 --push()--> 2 --pushReplacement()--> 3 --pushReplacement()--> 4] 当你点击后退按钮时,你将进入第一页。

作者头像

如果您想在使用命名路由时转到主页,请执行此操作

Navigator.of(context).popUntil((route) {
   if (route.settings.name != "/") return false;
   return true;
});