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

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配置问题。
修复步骤
  1. 修正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拉起时复用现有任务栈,不会重新创建应用实例。

  1. 优化认证流程代码,增加异常捕获和写入兜底,避免进程回收导致的写入丢失:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:33:20