Flutter使用image_picker仅iOS端偶发List<dynamic>转String?类型异常求助
问题原因
该偶发异常是image_picker库iOS端的历史已知问题,根因如下:
- 当选择的视频为iCloud同步缓存、带系统编辑记录、或包含特殊媒体元数据时,iOS系统相册接口返回的资源路径会被封装为
List<dynamic>类型,但低版本image_picker的方法通道解析逻辑默认直接将该字段强转为String?类型,触发类型不匹配报错。 - Android端无异常是因为安卓系统媒体库返回路径的逻辑固定为字符串格式,不会出现数组类型的返回值。
解决方法
方案1:升级依赖版本(优先推荐)
该问题在image_picker 0.8.6及以上正式版本已被官方修复,直接修改pubspec.yaml中的依赖版本即可:
dependencies: image_picker: ^0.8.6
修改后执行flutter clean清理缓存,再重新编译运行即可解决。
方案2:低版本兼容处理(无法升级依赖时使用)
如果项目存在其他依赖冲突无法升级image_picker,可以用以下两种方式兼容:
- 给
pickVideo调用加try-catch捕获异常,避免应用崩溃,同时做降级提示,修改后的业务代码如下:
pickVideo(ImageSource source) async { if (storagePermission) { try { final video = await ImagePicker() .pickVideo(source: source, maxDuration: const Duration(seconds: 60)); if (video == null) { Fluttertoast.showToast( msg: "No Video Selected!!".tr(), ); } else { Navigator.push( context, MaterialPageRoute( builder: (context) => ConfirmVideo( videofile: File(video.path), imageSource: source, videoFrom: widget.videoFrom, ))); } } catch (e) { Fluttertoast.showToast(msg: "视频读取失败,请重新选择"); } } }
- 手动修改
image_picker_platform_interface包中method_channel_image_picker.dart的getVideo方法,调整返回值解析逻辑:
// 找到原解析path的代码,替换为以下逻辑 dynamic rawPath = result['path']; String? path = rawPath is List ? rawPath.first?.toString() : rawPath?.toString();
额外配置校验
如果你的应用允许用户选择iCloud存储的视频,需要确认Xcode中已开启iCloud能力,且Info.plist中已添加iCloud容器相关配置,避免资源拉取异常导致的返回值格式错误。
内容的提问来源于stack exchange,提问作者GAGAN SINGH
相关产品推荐
相关产品推荐

