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

如何在go_router子路由中按返回键退出应用?

解决方案:GoRouter子路由按返回键直接退出应用

方法一:用WillPopScope拦截当前页面返回事件

在/a/1对应的页面组件中嵌套WillPopScope,通过条件判断决定是退出应用还是正常返回上一级路由。

示例代码:

import 'dart:io';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';

class A1Page extends StatelessWidget {
  const A1Page({super.key});

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async {
        // 替换为你的特定判断条件
        bool shouldExitApp = true;

        if (shouldExitApp) {
          // 根据平台执行退出逻辑
          if (Platform.isAndroid) {
            SystemNavigator.pop();
          } else if (Platform.isIOS) {
            exit(0);
          }
          // 返回false阻止默认返回行为
          return false;
        }
        // 条件不满足时正常返回上一级
        return true;
      },
      child: Scaffold(
        appBar: AppBar(title: const Text('A/1 页面')),
        body: const Center(child: Text('A/1 页面内容')),
      ),
    );
  }
}

方法二:自定义NavigatorObserver全局拦截

如果需要全局监听路由返回事件,可自定义NavigatorObserver,在didPop方法中判断当前路由和条件后执行退出操作。

示例代码:

import 'dart:io';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';

class CustomExitObserver extends NavigatorObserver {
  @override
  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPop(route, previousRoute);
    
    // 确认上一级路由为/a/1(即当前页面是/a/1,按下返回键时触发)
    if (previousRoute?.settings.name == '/a/1') {
      // 替换为你的特定判断条件
      bool shouldExitApp = true;
      if (shouldExitApp) {
        if (Platform.isAndroid) {
          SystemNavigator.pop();
        } else if (Platform.isIOS) {
          exit(0);
        }
      }
    }
  }
}

在GoRouter初始化时添加该Observer:

final GoRouter router = GoRouter(
  observers: [CustomExitObserver()],
  routes: [
    GoRoute(
      path: '/',
      builder: (context, state) => const HomePage(),
    ),
    GoRoute(
      path: '/a',
      builder: (context, state) => const APage(),
      routes: [
        GoRoute(
          path: '1',
          builder: (context, state) => const A1Page(),
        ),
      ],
    ),
    GoRoute(
      path: '/b',
      builder: (context, state) => const BPage(),
    ),
  ],
);

注意事项

  • 确保GoRoute的path配置与判断的路由名称完全一致。
  • iOS平台主动退出应用可能违反App Store审核规范,建议仅在必要场景使用,或遵循苹果交互设计指引。
  • WillPopScope仅作用于当前页面的返回事件,全局Observer需精准判断路由,避免影响其他页面逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:28:17