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

升级auto_route至9.2.2后Android返回键直接关闭Flutter应用

解决AutoRoute 9.2.2中AutoTabsScaffold返回键直接关闭APP的问题

问题描述

升级auto_route至9.2.2版本后,使用AutoTabsScaffold管理路由时,按下Android设备返回键会直接关闭应用,而在5.0.3版本中该功能正常。

路由配置示例

AutoRoute(
  path: 'a',
  page: A.page,
  children: [
    AutoRoute(
      initial: true,
      page: B.page,
    ),
    AutoRoute(
      page: C.page,
    ),
    AutoRoute(
      page: D.page,
    ),
    AutoRoute(
      page: E.page,
    ),
    AutoRoute(
      page: F.page,
    ),
  ],
),

AutoTabsScaffold(
  routes: [
    B(),
    C(),
    D(),
    E(),
    F(),
  ],
  bottomNavigationBuilder: (_, tabsRouter) {
    return BottomNavigationBar(...);
  },
),

开发环境

[√] Flutter (Channel stable, 3.24.3, on Microsoft Windows [Versión 10.0.22631.3880], locale es-419)
    • Flutter version 3.24.3 on channel stable at C:\Users\Liam\dev\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 2663184aa7 (7 weeks ago), 2024-09-11 16:27:48 -0500
    • Engine revision 36335019a8
    • Dart version 3.5.3
    • DevTools version 2.37.3

[√] Windows Version (Installed version of Windows is version 10 or higher)

[√] Android toolchain - develop for Android devices (Android SDK version 33.0.1)
    • Android SDK at C:\Users\Liam\AppData\Local\Android\sdk
    • Platform android-34, build-tools 33.0.1
    • Java binary at: C:\Program Files\Android\Android Studio\jbr\bin\java
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-b2043.56-10027231)
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe

[X] Visual Studio - develop Windows apps
    X Visual Studio not installed; this is necessary to develop Windows apps.
      Download at https://visualstudio.microsoft.com/downloads/.
      Please install the "Desktop development with C++" workload, including all of its default components

[√] Android Studio (version 2022.3)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-b2043.56-10027231)

[√] VS Code (version 1.94.2)
    • VS Code at C:\Users\Liam\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.96.0

[√] Network resources
    • All expected network resources are available.

已尝试的无效方案

  • 在App组件及各独立Widget中添加PopScope()
  • 设置android:enableOnBackInvokedCallback="false"

解决方案

AutoRoute 9.x版本对路由栈处理逻辑做了调整,需通过TabsRouter拦截返回事件,而非直接使用PopScope,具体实现如下:

  1. 在AutoTabsScaffold的bottomNavigationBuilder中,利用tabsRouter判断返回逻辑:
AutoTabsScaffold(
  routes: [B(), C(), D(), E(), F()],
  bottomNavigationBuilder: (_, tabsRouter) {
    return PopScope(
      canPop: false,
      onPopInvoked: (didPop) async {
        // 当前Tab栈有可返回页面时,执行Tab内返回
        if (tabsRouter.activeStack.canPop()) {
          tabsRouter.pop();
        } 
        // 当前不是初始Tab时,切换到首页Tab
        else if (tabsRouter.activeIndex != 0) {
          tabsRouter.setActiveIndex(0);
        } 
        // 所有条件满足后,再关闭应用
        else {
          SystemNavigator.pop();
        }
      },
      child: BottomNavigationBar(
        currentIndex: tabsRouter.activeIndex,
        onTap: (index) => tabsRouter.setActiveIndex(index),
        items: const [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: 'B'),
          BottomNavigationBarItem(icon: Icon(Icons.search), label: 'C'),
          // 其他Tab项配置
        ],
      ),
    );
  },
);
  1. 确保父路由A.page的子路由initial属性配置正确,且AutoTabsScaffold的routes与子路由完全匹配。

关键说明

AutoRoute 9.x适配了Flutter 3.x的PopScope逻辑,旧版本的返回拦截方式不再生效。必须通过TabsRouter管理Tab独立路由栈,先判断当前Tab是否有可返回页面、是否需要切换到初始Tab,再决定是否关闭应用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:40:22