升级image_picker到0.8.3+2后XFile无readAsBytesSync方法如何解决
问题原因
image_picker从0.8.0版本开始,选择媒体文件的返回类型从原生File调整为跨平台XFile类型,该类由cross_file依赖提供封装,未内置同步读取字节的readAsBytesSync方法,仅提供异步读取方法readAsBytes,因此触发对应报错。
修复方案
方案一:全平台兼容异步写法(推荐)
修改原有同步读取逻辑为异步调用,无需额外适配即可支持Android、iOS、Web、桌面端全平台:
// 先异步读取XFile的字节数组 Uint8List imageBytes = await pickedImage.readAsBytes(); // 再执行图片解码逻辑 Img.Image image = Img.decodeImage(imageBytes);
注意需将该代码段所在的外层函数添加async修饰符,配合await使用,示例完整逻辑如下:
import 'dart:typed_data'; import 'package:image_picker/image_picker.dart'; import 'package:image/image.dart' as Img; Future<void> pickAvatar() async { final XFile? pickedImage = await ImagePicker().pickImage(source: ImageSource.gallery); if (pickedImage == null) return; // 替换原有同步写法 Uint8List imageBytes = await pickedImage.readAsBytes(); Img.Image? image = Img.decodeImage(imageBytes); // 后续原有业务逻辑保持不变 }
方案二:非Web端同步写法
如果项目无需支持Web端,可直接将XFile转为原生File对象,保留原有同步读取逻辑:
import 'dart:io'; import 'package:image/image.dart' as Img; // 直接通过XFile的path属性构造原生File实例,调用原有同步方法 Img.Image? image = Img.decodeImage(File(pickedImage.path).readAsBytesSync());
该写法仅适配移动端、桌面端,Web端XFile的path属性为空,会触发空异常,不推荐跨平台项目使用。
验证操作
修改代码后执行flutter clean清除旧依赖缓存,再重新编译运行即可解决报错。
内容的提问来源于stack exchange,提问作者Nyoman Gunartha
相关产品推荐
相关产品推荐

