Flutter使用Navigator.push跳转后安卓按返回键回到上页,如何关闭页面?
解决方案
你可以通过拦截页面的返回手势/系统返回事件实现自定义返回逻辑,有两种常用实现方式:
方式1:使用WillPopScope(兼容所有Flutter版本)
在你要控制返回逻辑的MyPage的Scaffold外层包裹WillPopScope组件,通过onWillPop回调控制是否允许返回:
class MyPage extends StatelessWidget { const MyPage({super.key}); @override Widget build(BuildContext context) { return WillPopScope( // 返回false表示拦截系统返回逻辑,不会自动回到上一级 // 返回true表示允许系统默认返回行为 onWillPop: () async { // 这里可以写你自定义的关闭逻辑,比如先弹确认框、执行清理操作等 // 示例:自定义关闭页面逻辑 Navigator.pop(context); return false; }, child: Scaffold( // 你的原有页面代码 appBar: AppBar(title: const Text("MyPage")), body: const Center(child: Text("页面内容")), ), ); } }
注意:如果你的页面AppBar自带返回按钮,该按钮的点击逻辑不会被
WillPopScope拦截,如果你需要同时拦截左上角返回按钮的点击,需要自行替换AppBar的leading组件自定义点击逻辑。
方式2:使用PopScope(推荐,Flutter 3.16及以上版本支持)
Flutter新版本已将WillPopScope标记为弃用,推荐使用PopScope替代,用法如下:
class MyPage extends StatelessWidget { const MyPage({super.key}); @override Widget build(BuildContext context) { return PopScope( // canPop为false表示禁止默认的返回行为 canPop: false, // 拦截到返回动作时的回调 onPopInvoked: (bool didPop) { if (didPop) return; // 这里写你自定义的关闭逻辑 Navigator.pop(context); }, child: Scaffold( // 你的原有页面代码 appBar: AppBar(title: const Text("MyPage")), body: const Center(child: Text("页面内容")), ), ); } }
两种方案都可以拦截安卓系统的返回键触发的默认返回逻辑,你可以根据你的Flutter版本选择对应的实现。
内容的提问来源于stack exchange,提问作者l1z0b
相关产品推荐
相关产品推荐

