Flutter 如何使用 AssetBundle 存储和访问文件

Ser*_*sov 11 android dart flutter

编辑:这个问题是关于使用 AssetBundle,而那个问题(颤振中的文件列表)是关于使用目录的。它们因类别不同而不同。另外:我删除了一个部分,这可能类似于上一个问题。

我不明白如何使用 AssetBundle 访问文件...

例如,我在 pubspec.yaml 中的资产

assets:
- assets/images/
- assets/texts/
Run Code Online (Sandbox Code Playgroud)
  1. AssetBundle 有方法:loadString(key, ...) 和 loadStructuredData(key, ...) - 什么是键以及如何使用这些方法?

  2. 我需要从文本文件和其他文件加载数据。我知道有一个 rootBundle(或 DefaultAssetBundle.of(context))......但是如何使用它来加载文件?!

谢谢!

Ric*_*eap 14

让我们假设您clock.png在 assets/images 中有一个图像,distances.json在 assets/texts 中有一个 UTF-8 编码的文本文件。

key实际上只是资产的路径,因此您可以将整个文件作为 a 加载String并像这样解码 json:

String distancesText = await rootBundle.loadString('assets/texts/distances.json');
Map distances = json.decode(distancesText);
Run Code Online (Sandbox Code Playgroud)

loadString 为您处理 UTF-8 解码,并缓存字符串以便下次更快地访问。

loadStructuredData需要loadString进一步的一步-它加载的字符串,然后调用你提供的回调来解析字符串并返回结果。这次它缓存解码结果 - 现在保存下次读取和解码步骤。

Map distances2 = await rootBundle
    .loadStructuredData('assets/texts/distances.json', (String s) async {
  return json.decode(s);
});
Run Code Online (Sandbox Code Playgroud)

因此,这对文本文件来说非常有用;二进制文件呢?您可以将整个资产作为字节数组读取。

ByteData clockData = await rootBundle.load('assets/images/clock.png');
Uint8List clockBytes = clockData.buffer.asUint8List());
Run Code Online (Sandbox Code Playgroud)

现在您可以对文件的二进制内容做任何您需要做的事情。请注意,与字符串不同,二进制数据不会被缓存。

当然,对于 PNG,您很可能不会将其作为字节读取,而是将其作为Image带有AssetImage. (对于不同的 DPI 设备,资产图像也应该有多种分辨率。)请参阅资产和图像

我认为早些时候您想获得所有可用资产的完整列表。在某些方面,这毫无意义。您知道在构建时提供了哪些资产,因此您可以将资产列表保存在自己的某个地方 - 在代码中或在您自己的清单中。如果您真的想在运行时枚举它们,我认为您可以加载一个名为 的资产AssetManifest.json,但这似乎是一个实现细节,因此可能会发生变化。