gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:41:33 25 4
gpt4 key购买 nike

编辑: 这个问题是关于使用 AssetBundle 的,而那个问题 ( List of files in flutter ) 是关于使用目录的。它们因类别不同而不同。另外:我删除了一个部分,它可能与上一个问题类似。

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

比如我的 Assets 在pubspec.yaml

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

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

谢谢!

最佳答案

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

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

String distancesText = await rootBundle.loadString('assets/texts/distances.json');
Map distances = json.decode(distancesText);

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

loadStructuredDataloadString 更进一步 - 它加载 String,然后调用您提供的回调来解析 String 并返回结果。这次它缓存了解码结果 - 现在节省了下次读取和解码步骤。

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

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

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

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

当然,对于 PNG,您很可能不会将其作为字节读取,而是将其作为带有 AssetImageImage Widget 加载。 (对于不同的 DPI 设备, Assets 图像也应具有多种分辨率。)参见 Assets and Images .

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

关于android - Flutter 如何使用 AssetBundle 存储和访问文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50998573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com