Flutter:使用image_picker拍照点击确定后应用崩溃问题
问题:image_picker相机拍照后应用直接返回主页(仅单台Poco X3 Android 10设备触发)
- 依赖包:image_picker
- 现象:调用相机捕获图片,点击预览页“确定”后,应用直接退回主页,无任何错误日志输出
- 前置确认:相机、媒体存储权限已授予,现有错误捕获逻辑未生效
问题分析
你的代码存在await与then混用的异步逻辑冲突:await会等待pickImage执行完成,但后续的then会单独触发异步回调,导致pickedFile的赋值和后续事件添加逻辑执行顺序混乱,部分异常可能跳出了现有捕获范围。另外单台设备出现问题,大概率和该设备的相机配置、系统缓存或依赖版本兼容性有关。
修复方案
1. 重构异步代码,统一使用await写法
移除混用的then和onError,改用纯await+try/catch覆盖所有流程,确保异常能被正确捕获:
try { var _picker = ImagePicker(); XFile? pickedFile = await _picker.pickImage( source: ImageSource.camera, ); if (pickedFile != null) { bloc.emit(ShowToastState(file: pickedFile)); bloc.add(ProfileScreenProfileChangeEvent( pickedFile, ImageSource.camera, )); } else { // 处理用户取消拍照的场景 bloc.emit(ShowToastState(msg: "已取消拍照")); } } catch (e, stackTrace) { bloc.emit(ShowToastState(msg: e.toString())); handleCameraPermissionError(context, e); // 强制打印堆栈信息,方便排查单设备问题 print("相机拍照异常:$e,堆栈跟踪:$stackTrace"); }
2. 单台设备专属排查步骤
- 清除应用的缓存和存储数据,重启应用后重新测试
- 检查该设备的系统相机是否能正常工作,尝试更新系统或相机应用至最新版本
- 确认image_picker依赖版本是否适配Android 10,可尝试升级到最新稳定版,或回退至已知兼容的旧版本
- 用Android Studio的Logcat过滤该应用日志,即使无崩溃提示,底层可能存在文件存储、相机进程相关的警告/错误信息
3. 补充AndroidManifest适配配置
针对Android 10,确保AndroidManifest.xml中添加以下配置:
<!-- Android 10及以上媒体权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <application ... android:requestLegacyExternalStorage="true"> ... </application>
内容的提问来源于stack exchange,提问作者MAHALAKSHMI S
相关产品推荐
相关产品推荐

