Flutter使用Image_Picker打开相机时iOS应用崩溃如何解决?
问题原因
- 首要原因是iOS端未配置相机权限描述:iOS系统强制要求应用访问相机前必须在
Info.plist中添加NSCameraUsageDescription权限说明,未配置的情况下触发相机访问会被系统直接杀死进程,对应控制台输出Lost connection to device且无其他报错。 - 代码存在空安全逻辑错误:
pickedFile为可空类型,代码中先强行用!解包获取路径,再做非空判断,一旦用户取消拍照或者未拿到拍摄文件,就会触发空异常崩溃。 - 按钮点击逻辑存在上下文失效风险:
_getFromCamera是异步函数,原代码调用后立刻执行Navigator.pop关闭页面/弹窗,后续异步逻辑执行时依赖的context已经被销毁,可能触发异常。 - 若使用iOS模拟器测试:iOS模拟器本身不支持相机硬件,调用相机功能必然崩溃,需要用真机测试相机能力。
解决方案
1. 配置iOS相机权限
打开项目中ios/Runner/Info.plist文件,添加相机权限说明:
<key>NSCameraUsageDescription</key> <string>需要访问您的相机用于拍摄上传头像</string>
说明文本需明确标注权限用途,否则会被苹果审核驳回。
2. 修正空安全逻辑
调整非空判断顺序,禁止强行解包可空变量,修改后代码如下:
// get image File camera _getFromCamera(BuildContext context) async { XFile? pickedFile = await ImagePicker().pickImage( source: ImageSource.camera, maxWidth: 1800, maxHeight: 1800, ); // 先确认文件不为空再执行后续逻辑 if (pickedFile != null) { File rotatedImage = await FlutterExifRotation.rotateAndSaveImage(path: pickedFile.path); image = rotatedImage; final userId = widget.id; widget.bloc.uploadProfilePicture(image, userId); } }
3. 修正按钮异步调用逻辑
等待相机逻辑执行完成后再关闭页面,同时增加context.mounted判断避免上下文失效问题,修改后代码如下:
TextButton.icon( icon: Icon( Icons.photo_camera, color: Theme.of(context).primaryColor, ), label: Text( AppLocalization.of(context)! .getTranslatedValues("cameraLbl")!, style: TextStyle( color: Theme.of(context).colorScheme.secondary, fontWeight: FontWeight.bold), ), onPressed: () async { await _getFromCamera(context); // 确认上下文有效再执行关闭操作 if (context.mounted) { Navigator.of(context).pop(); } }, )
4. 其他注意事项
- 相机功能必须使用iOS真机测试,模拟器不支持相机硬件,调用必崩。
- 若仍有问题可以将
image_picker升级到最新稳定版本,排除版本兼容问题。
内容的提问来源于stack exchange,提问作者Jean Cuervo
相关产品推荐
相关产品推荐

