Flutter集成image_picker与file_picker包时出现PlatformException异常
Flutter集成image_picker与file_picker包时出现PlatformException异常
嘿,我之前也踩过这个坑!这个错误的根源其实很简单——iOS系统不允许同时打开两个文件选择器实例,当你先后触发image_picker和file_picker的请求时,第二个请求会直接把第一个给取消掉,就抛出了这个multiple_request异常。
给你两个实用的解决思路,按需选就行:
思路一:加状态锁避免并发请求
定义一个状态变量跟踪是否正在处理文件选择,确保同一时间只触发一个选择器:
bool _isPickingFile = false; Future<void> pickMedia() async { // 如果正在选择文件,直接返回,防止重复触发 if (_isPickingFile) return; _isPickingFile = true; try { // 先弹出弹窗让用户选择要选图片还是音频 final mediaType = await showDialog<String>( context: context, builder: (ctx) => AlertDialog( title: const Text('选择媒体类型'), actions: [ TextButton( onPressed: () => Navigator.pop(ctx, 'image'), child: const Text('相册图片'), ), TextButton( onPressed: () => Navigator.pop(ctx, 'audio'), child: const Text('音频文件'), ), ], ), ); if (mediaType == 'image') { // 调用image_picker选择图片 final pickedImage = await ImagePicker().pickImage(source: ImageSource.gallery); // 这里写你的图片处理逻辑 } else if (mediaType == 'audio') { // 调用file_picker选择音频 final pickedAudio = await FilePicker.platform.pickFiles(type: FileType.audio); // 这里写你的音频处理逻辑 } } catch (e) { // 针对性捕获异常并提示用户 if (e is PlatformException && e.code == 'multiple_request') { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('请等当前选择器关闭后再操作哦')), ); } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('选择失败:${e.toString()}')), ); } } finally { // 不管成功失败,都重置状态 _isPickingFile = false; } }
思路二:统一用file_picker处理所有文件选择
其实file_picker本身支持选择图片和音频,完全可以只用这一个包,从根源上避免冲突:
Future<void> pickMedia() async { final pickedFile = await FilePicker.platform.pickFiles( type: FileType.custom, // 按需添加你需要支持的文件格式 allowedExtensions: ['jpg', 'jpeg', 'png', 'mp3', 'wav', 'm4a'], ); if (pickedFile != null) { // 判断选中的是图片还是音频,再做对应处理 final fileExtension = pickedFile.files.first.extension?.toLowerCase(); if (['jpg', 'jpeg', 'png'].contains(fileExtension)) { // 图片处理逻辑 } else if (['mp3', 'wav', 'm4a'].contains(fileExtension)) { // 音频处理逻辑 } } }
另外别忘了检查iOS的Info.plist权限:
- 选图片需要添加
NSPhotoLibraryUsageDescription - 选音频文件如果涉及文件访问,可能需要
NSFileProviderDomainUsageDescription,按需配置就行。
内容来源于stack exchange
相关产品推荐
相关产品推荐

