Flutter中如何限制Wechat Asset Picker仅选择JPG图片
Flutter 多选JPG图片并压缩上传解决方案
依赖选择说明
- 无需更换现有第三方依赖,
wechat_assets_picker原生支持资源类型、格式过滤,完全可以满足仅选择JPG图片的需求,搭配现有flutter_image_compress即可实现完整流程,额外更换依赖会增加不必要的包体积和适配成本。 - 如果确实需要替换,可选择
multi_image_picker_plus,但功能和现有组件重合度极高,不推荐替换。
Wechat Asset Picker 仅展示、选择JPG图片配置方法
配置分两步完成,先过滤非图片资源,再过滤非JPG格式的图片:
- 在
AssetPickerConfig中设置requestType: RequestType.image,直接隐藏所有视频、音频等非图片类资源 - 配置
filterOptions参数,通过MIME类型规则仅保留JPG格式图片可被选中
修正后的选图代码如下:
final List<myimagepicker.AssetEntity>? result = await myimagepicker.AssetPicker.pickAssets( context, pickerConfig: const myimagepicker.AssetPickerConfig( gridCount: 3, maxAssets: 10, pickerTheme: null, themeColor: Color.fromARGB(255, 245, 91, 165), pageSize: 30, // 仅加载图片类资源,过滤视频、音频 requestType: myimagepicker.RequestType.image, // 仅保留JPG/JPEG格式图片 filterOptions: myimagepicker.FilterOptionGroup( imageOption: myimagepicker.FilterOption( mimeType: myimagepicker.MimeType.jpeg, ), ), ), );
压缩环节兜底适配(避免非JPG资源导致压缩报错)
由于部分安卓、iOS机型存在系统资源标识和实际格式不符的情况,选图完成后、压缩前增加一层格式校验和转码逻辑,确保进入压缩流程的文件一定是JPG格式:
// 遍历选中的资源列表处理 for (int i = 0; i < result.length; i++) { final asset = result[i]; final originFile = await asset.file; if (originFile == null) continue; // 获取资源实际MIME类型 final mimeType = await asset.mimeTypeAsync; String processPath = originFile.absolute.path; // 非JPG格式先转码为JPG临时文件 if (mimeType != 'image/jpeg') { final tempDir = await getTemporaryDirectory(); processPath = '${tempDir.path}/temp_${DateTime.now().millisecondsSinceEpoch}.jpg'; await FlutterImageCompress.compressAndGetFile( originFile.absolute.path, processPath, format: CompressFormat.jpeg, quality: 100, ); } // 原有JPG压缩逻辑 var compressedFile = await FlutterImageCompress.compressAndGetFile( processPath, outPath, quality: 50, format: CompressFormat.jpeg, ); // 后续执行Firestore上传逻辑即可 }
注意:请确认本地依赖的
wechat_assets_picker版本不低于8.0.0,低版本的过滤参数命名存在差异,可升级到最新稳定版后使用上述配置。
内容的提问来源于stack exchange,提问作者Mark Nugromentry
相关产品推荐
相关产品推荐

