首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用AssetBundle存储和访问文件

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

Stack Overflow用户
提问于 2018-06-23 06:28:25
回答 1查看 13.4K关注 0票数 11

编辑:这个问题是关于使用AssetBundle的,而这个问题(https://stackoverflow.com/questions/50975636/list-of-files-in-flutter)是关于使用目录的。他们是不同的,因为不同的阶级。另外:我删除了一个部分,可以类似于前面的问题。

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

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

代码语言:javascript
复制
assets:
- assets/images/
- assets/texts/
  1. AssetBundle有方法: loadString(key,.)以及loadStructuredData( key,.)-什么是密钥以及如何使用这些方法?
  2. 我需要从文本文件和其他文件中加载数据。我知道有一个rootBundle (或DefaultAssetBundle.of(上下文)).但是如何使用它来加载文件呢?!

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-23 21:10:38

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

key实际上只是资产的路径,因此您可以将整个文件作为一个String加载,并对json进行如下解码:

代码语言:javascript
复制
String distancesText = await rootBundle.loadString('assets/texts/distances.json');
Map distances = json.decode(distancesText);

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

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

代码语言:javascript
复制
Map distances2 = await rootBundle
    .loadStructuredData('assets/texts/distances.json', (String s) async {
  return json.decode(s);
});

因此,这对于文本文件是很好的;二进制文件呢?您可以将整个资产读取为一个字节数组。

代码语言:javascript
复制
ByteData clockData = await rootBundle.load('assets/images/clock.png');
Uint8List clockBytes = clockData.buffer.asUint8List());

现在,您可以对文件的二进制内容做您需要做的任何事情。注意,与String不同,二进制数据没有缓存。

当然,对于PNG,您很可能不会以字节的形式读取它,而是将其作为Image Widget加载到AssetImage中。(此外,对于不同的DPI设备,资产图像应该具有多个分辨率。)见资产和图像

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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50998573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档