Flutter如何获取上传图片asset的绝对路径?FlutterAbsolutePath不支持空安全求替代方案
替代FlutterAbsolutePath获取Asset绝对路径的空安全实现方案
实现前提
移除旧的flutter_absolute_path依赖,引入空安全适配的相册资源管理库photo_manager(目前主流相册选择类插件均依赖该库,无需额外引入)。
代码替换实现
原有逻辑不需要大幅改动,直接使用photo_manager内置的API即可完成Asset到可访问File对象的转换,无需手动拼接路径:
import 'package:photo_manager/photo_manager.dart'; // 原有逻辑获取到的Asset对象 Asset asset = resultList![i]; String fileName = asset.title ?? 'unknown_${DateTime.now().millisecondsSinceEpoch}.jpg'; // 直接获取可读写的File对象,内部自动适配content:// URI转本地路径 File? file = await asset.file; if (file == null) { // 可自行补充文件获取失败的异常处理逻辑 return; } print('FILE ABS :${file.absolute.path}'); // 输出格式与原有插件一致:/data/user/0/com.appname.com/cache/IMG_xxxxxx.png List<int>? compressedFile; if (file.lengthSync() > 300000) { compressedFile = await FlutterImageCompress.compressWithFile( file.absolute.path, quality: 25, ); } Network.MultipartFile multipartFile = await Network.MultipartFile.fromBytes( compressedFile != null ? compressedFile : await file.readAsBytes(), filename: fileName );
方案优势
- 完全支持空安全,库持续迭代维护,适配Android 13+、iOS最新版本的系统权限与存储规则
- 自动处理Android端
content://格式的资源URI转换,无需手动拼接路径避免兼容性问题 - 原有压缩、上传逻辑无需调整,侵入性极低
注意:Android 10及以上系统无法直接获取公共媒体目录的原始路径,返回的路径是应用沙盒内的缓存路径,和原有插件输出一致,不影响文件读取、压缩、上传操作。
内容的提问来源于stack exchange,提问作者Mohammed Niyaz
相关产品推荐
相关产品推荐

