如何在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
相关产品推荐
相关产品推荐

