有没有一种方法可以将资产图片用作文件。 我需要一个文件,以便可以使用http在Internet上对其进行测试。我已经尝试过Stackoverflow.com(How to load images with image.file)的一些答案,但收到错误消息“无法打开文件,(操作系统错误:无此类文件或目录,errno = 2)”。随附的代码行也给出了错误。
File f = File('images/myImage.jpg');
RaisedButton(
onPressed: ()=> showDialog(
context: context,
builder: (_) => Container(child: Image.file(f),)),
child: Text('Show Image'),)
使用Image.memory小部件(有效)
Future<Null> myGetByte() async {
_byteData = await rootBundle.load('images/myImage.jpg');
}
/// called inside build function
Future<File> fileByte = myGetByte();
/// Show Image
Container(child: fileByte != null
? Image.memory(_byteData.buffer.asUint8List(_byteData.offsetInBytes, _
byteData.lengthInBytes))
: Text('No Image File'))),
答案 0 :(得分:2)
您可以通过rootBundle
访问字节数据。然后,您可以将其保存到path_provider
获得的设备临时目录中(您需要将其添加为依赖项)。
import 'dart:async';
import 'dart:io';
import 'package:flutter/services.dart' show rootBundle;
import 'package:path_provider/path_provider.dart';
Future<File> getImageFileFromAssets(String path) async {
final byteData = await rootBundle.load('assets/$path');
final file = File('${(await getTemporaryDirectory()).path}/$path');
await file.writeAsBytes(byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));
return file;
}
在您的示例中,您将这样调用此函数:
File f = await getImageFileFromAssets('images/myImage.jpg');
有关写入字节数据的更多信息,check out this answer。
您将需要await
Future
并为此,使函数async
:
RaisedButton(
onPressed: () async => showDialog(
context: context,
builder: (_) => Container(child: Image.file(await getImageFileFromAssets('images/myImage.jpg')))),
child: Text('Show Image'));
答案 1 :(得分:2)
使用flutter_absolute_path软件包。
flutter_absolute_path:^ 1.0.6
在pubsec.yaml中
要从这种格式转换文件路径:
“content://media/external/images/media/5275”
收件人
"/storage/emulated/0/DCIM/Camera/IMG_00124.jpg”
======
List <File> fileImageArray = [];
assetArray.forEach((imageAsset) async {
final filePath = await FlutterAbsolutePath.getAbsolutePath(imageAsset.identifier);
File tempFile = File(filePath);
if (tempFile.existsSync()) {
fileImageArray.add(tempFile);
}
答案 2 :(得分:1)
从资产中获取文件而不提供路径。
import 'package:path_provider/path_provider.dart';
Future<File> getImageFileFromAssets(Asset asset) async {
final byteData = await asset.getByteData();
final tempFile =
File("${(await getTemporaryDirectory()).path}/${asset.name}");
final file = await tempFile.writeAsBytes(
byteData.buffer
.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes),
);
return file;
}