Flutter调用含Firebase逻辑的StatefulWidget时崩溃提示Lost connection to device
问题根因
崩溃由两个核心问题触发:
- 你当前使用的x86安卓模拟器未预装Google Play服务,Firebase核心功能依赖该服务运行
- gRPC库与安卓系统内置的conscrypt安全库存在兼容性问题,SSL协商时调用不存在的
getAlpnSelectedProtocol方法,抛出断言错误直接导致应用进程被杀
解决方案
1. 更换运行设备/模拟器(优先级最高)
- 优先使用搭载Google Play服务的实体安卓设备测试,可直接解决90%以上的该类问题
- 若必须使用模拟器,创建新模拟器时选择带Google Play标识的系统镜像(创建页Target列会明确标注Google Play),不要使用原生AOSP镜像,后者默认无Google服务组件
2. 修复gRPC兼容性问题
若更换设备后仍出现相同报错,在android/app/build.gradle文件的dependencies代码块中添加如下配置,强制使用兼容版本的gRPC库:
dependencies { implementation 'io.grpc:grpc-okhttp:1.46.0' // 原有其他依赖保持不变 }
3. 代码潜在问题修复
你当前的代码存在两处潜在异常风险,建议同步修改避免后续崩溃:
Firebase.initializeApp()建议放到应用入口main.dart的main方法中执行,不要放在页面的FutureBuilder内,避免重复初始化抛出异常- StreamBuilder中获取文档数据的代码增加空判断,避免文档为空时类型转换报错:
// 原有代码 Map<String, dynamic> items = snapshot.data!.data as Map<String, dynamic>; // 修改为 Map<String, dynamic> items = (snapshot.data!.data() ?? {}) as Map<String, dynamic>;
4. 临时本地调试方案
若暂时没有可用的带Google服务的设备,可先开启Firestore离线持久化,禁用网络测试本地逻辑,在connectToFirebase方法初始化完database后添加:
await FirebaseFirestore.instance.disableNetwork();
功能测试完成后移除该行代码即可。
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

