Navigator.popUntil flutter显示黑屏
Navigator.popUntil flutter show black screen
我的项目中有两个不同的流程。
- 主页 -> 页面 A -> 页面 B -> 页面 C -> 页面 A
从C页到A页,我使用这段代码,效果很好。
Navigator.popUntil(context, ModalRoute.withName(AssetMenu.ROUTE));
- 当收到推送通知时,用户点击推送通知,我希望它像这样直接导航
主页 -> 页面 B -> 页面 C -> 点击页面 C 中的按钮后返回页面 A。
但是点击C页的按钮时黑屏
我该如何处理?
在您的第二个用例中缺少 Page A
。当您调用 Navigator.popUntil()
时,导航器会向上移动路线堆栈并弹出它们,直到找到指定的路线。如果指定的路由不在栈中,它将移除路由,直到栈为空。这就是您出现黑屏的原因。
如果你想把 Main Page -> Page B -> Page C
变成 Main Page -> Page A
你必须调用 Navigator.pushAndRemoveUntil()
where the new route is Page A
and the predicate matches the Main Page
. Alternatively use Navigator.pushNamedAndRemoveUntil()
.
也许你可以试试这个
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) => AssetMenu(),), (route) => route.isFirst);
我建议使用 name routes,即使你的应用程序越来越大,页面越来越多,它也会更容易。我更喜欢让 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,并在应用栏的新页面上获得 return 按钮。
例如,当你在第二页时,使用 pushReplacement() 方法打开第三页,当你点击后退按钮时,你将转到第一页并跳过第二页。
为了更清楚,您可以这样导航到第四页:
[ 1 --push()--> 2 --pushReplacement()--> 3 --pushReplacement()--> 4]
当您点击后退按钮时,您将到达第一页。
如果您想在不使用命名路由
时转到主页,请执行此操作
Navigator.of(context).popUntil((route) {
if (route.settings.name != "/") return false;
return true;
});
我的项目中有两个不同的流程。
- 主页 -> 页面 A -> 页面 B -> 页面 C -> 页面 A
从C页到A页,我使用这段代码,效果很好。
Navigator.popUntil(context, ModalRoute.withName(AssetMenu.ROUTE));
- 当收到推送通知时,用户点击推送通知,我希望它像这样直接导航
主页 -> 页面 B -> 页面 C -> 点击页面 C 中的按钮后返回页面 A。
但是点击C页的按钮时黑屏
我该如何处理?
在您的第二个用例中缺少 Page A
。当您调用 Navigator.popUntil()
时,导航器会向上移动路线堆栈并弹出它们,直到找到指定的路线。如果指定的路由不在栈中,它将移除路由,直到栈为空。这就是您出现黑屏的原因。
如果你想把 Main Page -> Page B -> Page C
变成 Main Page -> Page A
你必须调用 Navigator.pushAndRemoveUntil()
where the new route is Page A
and the predicate matches the Main Page
. Alternatively use Navigator.pushNamedAndRemoveUntil()
.
也许你可以试试这个
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) => AssetMenu(),), (route) => route.isFirst);
我建议使用 name routes,即使你的应用程序越来越大,页面越来越多,它也会更容易。我更喜欢让 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,并在应用栏的新页面上获得 return 按钮。 例如,当你在第二页时,使用 pushReplacement() 方法打开第三页,当你点击后退按钮时,你将转到第一页并跳过第二页。
为了更清楚,您可以这样导航到第四页:
[ 1 --push()--> 2 --pushReplacement()--> 3 --pushReplacement()--> 4]
当您点击后退按钮时,您将到达第一页。
如果您想在不使用命名路由
时转到主页,请执行此操作Navigator.of(context).popUntil((route) {
if (route.settings.name != "/") return false;
return true;
});