首页 > 解决方案 > 使用 Navigator.pushReplacementNamed() 替换颤动页面后如何在屏幕中启用后退按钮?

问题描述

假设我有两个屏幕 A 和 B 。

我在屏幕 A 上,我使用 pushReplacementNamed() 进入屏幕 B。

现在我想在用户向右滑动时返回屏幕 A(iOS 中默认为后退按钮)。

屏幕 A:

  Navigator.pushReplacementNamed(context, '/B'),

屏幕 B:

WillPopScope(
      onWillPop: () async {
        Navigator.pushReplacementNamed(context, '/A');
        return false;
      }),

但这不起作用。后退按钮仍处于禁用状态。

注意 - 我不想在 AppBar 中制作自定义后退按钮来实现这一点。我想使用默认的后退按钮行为。

标签: flutterflutter-dependencies

解决方案


我认为您的代码有问题的是您从 onWillPop 返回 false,返回 false 忽略了后按的操作。尝试将其更改为 true。

此外,如果您想最终从屏幕 B 返回到屏幕 A,那么在屏幕 A 上使用 push() 然后在屏幕 B 上的 onWillPop 上使用更有意义,您不再需要使用导航器手动弹出路线,您可以返回真。

更新

针对您下面的评论,对于您想要实现的目标,您通常可以在页面上推送路由Home,然后在您可以使用的其他页面上推送pushNamedAndRemoveUntil

Navigator.of(context).pushAndRemoveUntil("B",ModalRoute.withName('Home'));

它将推送您想要的页面并删除所有内容,直到主页页面。由于“主页”现在将始终是根目录,因此您不再需要覆盖onWillPop并可以继续使用正常的后退按钮弹出。

注意:页面“主页”必须已经存在于堆栈中才能正常工作。


如果您想从堆栈更改中推送和删除其他所有内容:

 ModelRoute.withName("Home"),

(Route<dynamic> route) => false,

推荐阅读