无法在Flutter中加载资产

时间:2020-01-08 14:30:41

标签: flutter flutter-dependencies

我正在分享使用image_picker用相机拍摄的照片。它可以在模拟器上正常运行,但不能在我的设备上运行:

onPressed: () async {
  ByteData image = await rootBundle.load(team.avatar.path);
  ...
},

这是路径错误:

无法加载资产: /storage/emulated/0/Android/data/drodriguez.apps.Words/files/Pictures/scaled_2eccad3d-382e-462e-b124-b8fa06a2a32b791445736175256137.jpg

所显示的图像没有错误,因此路径是100%正确的:

Image.file(
  _orderedTeams[index].avatar,
  fit: BoxFit.cover,
  height: 92.0,
  width: 92.0,
)

我是否需要在pubspec.yml上添加其他内容?

1 个答案:

答案 0 :(得分:1)

您不能使用rootBundle访问手机上的文件。 rootBundle(如其docs中所述)仅适用于在构建时随应用程序打包的文件(可能保存在资产上,在pubspec上声明等)。

如果您想从手机中加载图片,this可能会有所帮助。


答案

此函数可以读取filePath并返回Uint8List(一个byteArray):

Future<Uint8List> _readFileByte(String filePath) async {
    Uri myUri = Uri.parse(filePath);
    File audioFile = new File.fromUri(myUri);
    Uint8List bytes;
    await audioFile.readAsBytes().then((value) {
    bytes = Uint8List.fromList(value); 
    print('reading of bytes is completed');
  }).catchError((onError) {
      print('Exception Error while reading audio from path:' +
      onError.toString());
  });
  return bytes;
}

然后,只需ByteData

var path = 'Some path to an image';
var byteArray = _readFileByte(path);
ByteData data = ByteData.view(byteArray.buffer);

(答案基于this