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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:06:05