Flutter中ImagePicker选取图片无法转Uint8List 能否使用RootBundle实现
Flutter 读取本地临时目录图片转Uint8List的正确方案
RootBundle 设计定位为读取App编译打包阶段预置、且在pubspec.yaml中assets字段声明的静态资源,无法读取运行时生成、存储在应用沙盒(临时目录、文档目录等)中的动态文件,加载报错属于工具选型错误。
原代码存在两个核心问题:
- 选型错误:使用RootBundle读取本地沙盒动态文件,该API不支持该场景
- 异步逻辑错误:调用异步方法未添加
await关键字,方法会在异步赋值完成前返回空值
最优实现方案
ImagePicker返回的XFile实例自带readAsBytes()方法,可直接返回Uint8List格式数据,无需自行拼接路径读取:
import 'dart:typed_data'; import 'package:image_picker/image_picker.dart'; static Future<Uint8List?> pickImage(PickType type) async { try { XFile? photo = await ImagePicker().pickImage( source: type == PickType.Camera ? ImageSource.camera : ImageSource.gallery, imageQuality: 80, ); if (photo == null) return null; // 直接获取Uint8List格式数据 Uint8List imageBytes = await photo.readAsBytes(); return imageBytes; } catch (e) { print(e); return null; } }
从指定路径读取本地沙盒文件方案
如果场景需要从已知的临时目录路径读取文件,使用dart:io的File类实现即可:
import 'dart:io'; import 'dart:typed_data'; Future<Uint8List?> readLocalFile(String filePath) async { try { File targetFile = File(filePath); if (await targetFile.exists()) { return await targetFile.readAsBytes(); } return null; } catch (e) { print(e); return null; } }
存储到列表的实现
定义字节列表变量,将拿到的Uint8List直接存入即可:
// 定义存储图片字节的全局/页面级列表 List<Uint8List> pickedImageList = []; // 调用选图方法后存入列表 Uint8List? imageBytes = await pickImage(PickType.Gallery); if (imageBytes != null) { pickedImageList.add(imageBytes); }
内容的提问来源于stack exchange,提问作者Tony Hart
相关产品推荐
相关产品推荐

