Android 13 Flutter应用返回时异常退出问题求助
以下是针对你遇到的「页面2返回页面1时应用直接退出」问题的具体排查方向和解决方法:
检查导航栈完整性
先确认当前导航栈的结构,在页面2中打印路由栈信息:// 使用GetX的情况 print(Get.routing.currentTreeBranch); // 使用原生Navigator的情况 print(Navigator.of(context).widget.toString());如果输出中没有页面1,说明首页跳转页面1时可能误使用了
pushReplacement/Get.off类方法(哪怕你认为没用到,检查代码细节,比如是否封装了跳转工具类导致的隐性替换),必须确保首页到页面1的跳转用Get.to()或Navigator.push()。修正WillPopScope逻辑
之前用WillPopScope没解决,大概率是判断逻辑有误。试试基于路由栈长度的判断:// GetX版本 WillPopScope( onWillPop: () async { if (Get.routing.routeTree.length > 1) { Get.back(); return false; // 阻止系统默认退出动作 } return true; // 栈只剩根页面时允许退出 }, child: YourPageWidget(), ) // 原生Navigator版本 WillPopScope( onWillPop: () async { final canPop = Navigator.of(context).canPop(); if (canPop) { Navigator.of(context).pop(); return false; } return true; }, child: YourPageWidget(), )注意:要确保这个WillPopScope包裹在页面的顶级Scaffold外层,而不是页面内的某个子widget。
排查Android 13适配问题
Android 13对应用后台行为和返回键逻辑有调整,可能存在系统误判。可以尝试在AndroidManifest.xml中调整Activity配置:<activity android:name=".MainActivity" android:launchMode="singleTop"> <!-- 其他配置 --> <meta-data android:name="android.app.exitOnClose" android:value="false" /> </activity>避免使用
singleInstance或singleTask这类可能导致栈异常的启动模式。检查页面生命周期与内存回收
在页面1的initState和dispose方法中添加日志:@override void initState() { super.initState(); print("页面1初始化"); } @override void dispose() { print("页面1销毁"); super.dispose(); }如果从页面2返回时,页面1已经被销毁,说明Android 13的内存管理可能回收了页面1,这时候可以尝试用
AutomaticKeepAliveClientMixin保持页面状态:class Page1 extends StatefulWidget { @override _Page1State createState() => _Page1State(); } class _Page1State extends State<Page1> with AutomaticKeepAliveClientMixin { @override bool get wantKeepAlive => true; @override Widget build(BuildContext context) { super.build(context); // 必须调用 return Scaffold(...); } }排查第三方插件冲突
某些与路由、生命周期相关的第三方插件(比如权限插件、推送插件)可能在Android 13上干扰导航栈。尝试临时移除非核心插件,逐一排查是否是插件导致的问题。
内容的提问来源于stack exchange,提问作者dhruvin savaliya

