Flutter Web认证在特定硬件上提示Lost connection to device报错
问题结论
Android 8(API 26)完全适配flutter_web_auth 0.4.1的Web认证方案,不存在版本兼容问题。你遇到的Chrome拉起后调试连接断开、认证返回应用重启、Token未存储始终回到登录页的问题,核心原因是AndroidManifest配置缺失必要属性,加上EMUI 8系统的后台回收机制、任务栈处理逻辑和Android 9原生逻辑存在差异,跳转回应用时原进程被系统回收重启,导致异步回调上下文丢失、Token写入流程中断。
调试方案
- 不要依赖Flutter调试连接排查问题:Android 8设备上拉起外部Chrome时调试连接临时断开是正常现象,不代表应用崩溃。你可以在
authenticate方法的每一步加本地文件日志,记录回调返回值、Token解析结果、SharedPreferences写入状态,应用重启后直接读取本地日志就能定位流程中断的具体位置。 - 排除系统策略干扰:打开平板开发者选项,将后台进程限制设为标准限制,关闭系统省电模式,在应用电池管理中开启「允许后台活动」,排除EMUI 8默认杀后台的影响。
- 快速定位配置问题:手动打开平板自带浏览器,地址栏输入
com.example.zzzzzzzz://success?token=test123直接访问,如果此时应用依然重启、闪启动页,即可确认是AndroidManifest配置问题。
修复步骤
- 修正AndroidManifest.xml中CallbackActivity的配置,补充缺失的属性适配Android 8及以下版本的任务栈规则,修改后配置如下:
<activity android:name="com.linusu.flutter_web_auth.CallbackActivity" android:exported="true" android:launchMode="singleTask" android:alwaysRetainTaskState="true"> <intent-filter android:label="flutter_web_auth"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="com.example.zzzzzzzz" /> </intent-filter> </activity>
关键配置说明:
android:exported="true"是Android 12以下版本接收外部跨应用跳转必须显式声明的属性,原配置缺失该属性时,EMUI 8会将自定义scheme跳转判定为未授权访问,直接重启应用主进程而非走正常回调流程;singleTask启动模式保证回调Activity拉起时复用现有任务栈,不会重新创建应用实例。
- 优化认证流程代码,增加异常捕获和写入兜底,避免进程回收导致的写入丢失:
authenticate() async { try { final result = await FlutterWebAuth.authenticate( url: "https://xxxx.yyyy.eu/auth/login?authorize=yes", callbackUrlScheme: "com.example.zzzzzzzz", // 可选:传该参数使用应用内临时WebView认证,完全规避外部Chrome跳转导致的进程回收问题 preferEphemeral: true ); final token = Uri.parse(result).queryParameters['token'] ?? ''; if (token.isEmpty) return; var prefs = await SharedPreferences.getInstance(); // 等待写入完成再执行后续逻辑,避免系统杀进程导致内存数据未落盘 await prefs.setString("token", token); refreshAfterAuthentication(); } catch (e) { debugPrint("认证流程异常:$e"); } }
验证注意事项
修改配置后先执行flutter clean清除构建缓存,卸载平板上的旧应用包再重新安装,不要通过热重载/热更新推送修改,避免Manifest配置不生效。验证顺序:
- 先测试浏览器手动输入自定义scheme,确认拉起应用不重启、不闪启动页
- 再走完整认证流程,确认返回后正常刷新视图
- 最后手动杀进程重启应用,确认Token已持久化存储,不会回到登录页
内容的提问来源于stack exchange,提问作者Alaindeseine
相关产品推荐
相关产品推荐

