使用Navigator.pushReplacementNamed()替换flutter中的页面后,如何在屏幕中启用后退按



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

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

现在,当用户向右滑动时,我想回到屏幕A(iOS中后退按钮的默认设置(。

屏幕A:

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

屏幕B:

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

但这是行不通的。后退按钮仍然被禁用。

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

我认为你的代码有问题的是,你从onWillPop返回了false,返回false忽略了反点击的操作。试着把它变成真的。

此外,如果你想最终从屏幕B返回屏幕A,只需在屏幕A上使用push((,然后在屏幕B上使用WillPop就更有意义了。你不再需要使用navigator手动弹出路线,只需返回true即可。

更新

作为对您下面评论的回应,对于您想要实现的目标,您通常可以在Home页面上推送一条路线,然后在其他页面上只需使用pushNamedAndRemoveUntil:

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

它会推送你想要的页面,并删除所有内容,直到主页。由于";主页";现在将始终是根,您不再需要覆盖onWillPop,并且可以使用正常的弹出后退按钮继续操作。

注意:页面"主页";必须已经存在于堆栈中才能使其工作。


如果您想从堆栈中推送并移除所有其他内容,请更改:

ModelRoute.withName("Home"),

(Route<dynamic> route) => false,

最新更新