You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:15:02