flutter - 使用 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 中制作自定义后退按钮来实现这一点。我想使用默认的后退按钮行为。
解决方案
我认为您的代码有问题的是您从 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,
推荐阅读
- list - 在 Haskell 中使用分隔字符将字符串划分为更多部分
- geolocation - 有没有办法在 Facebook 的 Spark AR 中访问地理位置数据?
- c# - Azure DevOps 中无法识别 Microsoft Enterprise Library
- docker - 我可以将 docker fluentd 日志驱动程序配置为直接连接到容器吗?
- ios - 如何获得图像的原始颜色
- glsl - GLSL 绘图磁盘扇区。夹角问题
- tvos - 哪个模板用于 TVML 中的表格数据?
- sharepoint-online - SharePoint - 获取保留或合法保留下的所有网站集
- json - 使用带有角度工作空间文件的 webpack 包分析器
- data-structures - 为什么我的代码的遍历部分不起作用?