这是我的 pubspec.yaml:
assets:
- assets/mySecertImage.png
Run Code Online (Sandbox Code Playgroud)
这是我读回资产的方式:
var data = await PlatformAssetBundle().load('assets/mySecertImage.png');
Run Code Online (Sandbox Code Playgroud)
我可以获取文件路径而不是直接读取它吗?如果不能这样做,是否有可能将其更改data为File对象?谢谢。
iKK*_*iKK 18
你找到解决办法了吗?(我也在寻找同样的东西)。
这是我追求的解决方法(由于缺乏更好的主意)...:
我愿意:
这是 Dart 代码:
import 'package:path/path.dart';
Directory directory = await getApplicationDocumentsDirectory();
var dbPath = join(directory.path, "app.txt");
ByteData data = await rootBundle.load("assets/demo.txt");
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
await File(dbPath).writeAsBytes(bytes);
Run Code Online (Sandbox Code Playgroud)
有些人还使用getDatabasesPath()代替getApplicationDocumentsDirectory()。但我认为在 iOS 模拟器上,这最终是完全相同的位置。(未在 Android 上验证)...所以,它会说:
var dbDir = await getDatabasesPath();
var dbPath = join(dbDir, "app.txt");
ByteData data = await rootBundle.load("assets/demo.txt");
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
await File(dbPath).writeAsBytes(bytes);
Run Code Online (Sandbox Code Playgroud)
对于 iOS 模拟器:在以上两个示例中,您都可以在文件夹下找到复制的文件:
/Users/username/Library/Developer/CoreSimulator/Devices/AE5C3275-CD65-3537-9B32-53533B97477C/data/Containers/Data/Application/7BE2B2EE-4E45-3783-B4BD-341DA83C43BD/Documents/app.txt
(当然,UUID 在你的情况下是不同的......)
如果您只想在文件不存在时复制文件,您可以编写:
Directory directory = await getApplicationDocumentsDirectory();
var dbPath = join(directory.path, "app.txt");
if (FileSystemEntity.typeSync(dbPath) == FileSystemEntityType.notFound) {
ByteData data = await rootBundle.load("assets/demo.txt");
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
await File(dbPath).writeAsBytes(bytes);
}
Run Code Online (Sandbox Code Playgroud)
Cri*_*sti 11
您无法获取资产文件的文件路径,因为与您的应用程序捆绑在一起的资产存储在存档中。
请参阅此处的“资产建设”部分:
https://flutter.dev/docs/development/ui/assets-and-images#asset-bundling
在构建过程中,Flutter 将资产放入一个称为资产包的特殊存档中,应用程序在运行时从中读取。
小智 5
我遇到了同样的问题,但通过调用此方法解决了。
Future<File> getImageFileFromAssets(String path) async {
final byteData = await rootBundle.load('assets/$path');
final buffer = byteData.buffer;
Directory tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path;
var filePath =
tempPath + '/file_01.tmp'; // file_01.tmp is dump file, can be anything
return File(filePath)
.writeAsBytes(buffer.asUint8List(byteData.offsetInBytes,
byteData.lengthInBytes));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23313 次 |
| 最近记录: |