编辑:这个问题是关于使用AssetBundle的,而这个问题(https://stackoverflow.com/questions/50975636/list-of-files-in-flutter)是关于使用目录的。他们是不同的,因为不同的阶级。另外:我删除了一个部分,可以类似于前面的问题。
我不明白如何使用AssetBundle来访问文件.
例如,我在pubspec.yaml中的资产
assets:
- assets/images/
- assets/texts/谢谢!
发布于 2018-06-23 21:10:38
让我们假设在资产/图像中有一个图像clock.png,资产/文本中有一个UTF-8编码的文本文件distances.json。
key实际上只是资产的路径,因此您可以将整个文件作为一个String加载,并对json进行如下解码:
String distancesText = await rootBundle.loadString('assets/texts/distances.json');
Map distances = json.decode(distancesText);loadString为您处理UTF-8解码,并缓存字符串以便下次更快地访问。
loadStructuredData更进一步,它加载字符串,然后调用您提供的回调来解析字符串并返回结果。这一次,它缓存解码结果--现在保存下一次读取和解码步骤。
Map distances2 = await rootBundle
.loadStructuredData('assets/texts/distances.json', (String s) async {
return json.decode(s);
});因此,这对于文本文件是很好的;二进制文件呢?您可以将整个资产读取为一个字节数组。
ByteData clockData = await rootBundle.load('assets/images/clock.png');
Uint8List clockBytes = clockData.buffer.asUint8List());现在,您可以对文件的二进制内容做您需要做的任何事情。注意,与String不同,二进制数据没有缓存。
当然,对于PNG,您很可能不会以字节的形式读取它,而是将其作为Image Widget加载到AssetImage中。(此外,对于不同的DPI设备,资产图像应该具有多个分辨率。)见资产和图像。
我认为,早些时候,您希望获得所有可用资产的完整列表。在某些方面,这是毫无意义的。您知道您在构建时提供了哪些资产,这样您就可以将资产列表保存在某个地方--代码中或您自己的清单中。如果您真的想在运行时枚举它们,我认为您可以加载一个名为AssetManifest.json的资产,但这似乎是一个实现细节,因此可能会发生更改。
https://stackoverflow.com/questions/50998573
复制相似问题