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

Flutter应用WillPopScope失效:双击返回键退出功能异常求助

解决Flutter双击返回键退出应用的WillPopScope未生效问题

问题原因

你的代码中,WillPopScope被放在最外层,但Scaffold的body里嵌套了自定义的Navigator(keyOne)。Flutter中返回键事件会被当前上下文的最上层Navigator拦截处理,因此外层的WillPopScope无法接收到返回键事件,导致双击退出逻辑完全不触发,点击返回键直接退出应用。

解决方案

将WillPopScope移到内部Navigator的上层,确保返回键事件先经过退出逻辑处理,同时保留原有的_onWillPop方法逻辑,兼顾内部页面栈管理和双击退出判断。

修改后的关键代码

1. 调整_buildDashBoardScaffoldWidget的body部分

把内部Navigator用WillPopScope包裹:

Widget _buildDashBoardScaffoldWidget() {
  return Scaffold(
    backgroundColor: semiWhiteColor,
    // 将WillPopScope移到内部Navigator外层,拦截返回键事件
    body: WillPopScope(
      onWillPop: _onWillPop,
      child: Navigator(
        key: keyOne,
        onGenerateRoute: (routeSettings) {
          return MaterialPageRoute(
            builder: (context) => pageList[_selectedIndex],
          );
        },
      ),
    ),
    // 底部导航栏代码保持不变
    bottomNavigationBar: Container(
      // ...原有代码
    ),
  );
}

2. 移除外层冗余的WillPopScope

删除最外层的WillPopScope,修改build方法:

@override
Widget build(BuildContext context) {
  return StreamBuilder<ConnectivityResult>(
    initialData: _connectivityResult,
    stream: Connectivity().onConnectivityChanged,
    builder: (context, snapshot) {
      return (_connectivityResult == ConnectivityResult.none ||
              snapshot.data == ConnectivityResult.none)
          ? CheckInternetConnectionWidget(
              snapshot: snapshot, 
              child: PickupLayout(
                scaffold: _buildDashBoardScaffoldWidget(), 
                uid: globalCurrentUserData.firebaseId!, 
                failedScaffold: _buildDashBoardScaffoldWidget()
              ),
            )
          : PickupLayout(
              scaffold: _buildDashBoardScaffoldWidget(), 
              uid: globalCurrentUserData.firebaseId!, 
              failedScaffold: _buildDashBoardScaffoldWidget()
            );
    },
  );
}

验证逻辑

  • 内部Navigator存在可弹出页面时(如某个tab内push了新页面),点击返回键会先弹出内部页面,不触发退出提示。
  • 内部Navigator处于初始页面时,首次点击返回键显示Toast提示,2秒内再次点击则退出应用。
  • 点击底部导航栏的Live页面时,外层Navigator弹出的页面会优先被返回键关闭,回到Dashboard后才会触发双击退出逻辑。

内容的提问来源于stack exchange,提问作者Ganesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:27:04