【发布时间】:2021-08-23 06:05:30
【问题描述】:
原始问题
我编写了一个 dart 包,我的颤振应用程序正在使用它。 在 dart 包中,我想将一些静态数据存储在一个我想从 dart 包代码中读取的 json 文件中。
但是我找不到直接从 dart 包访问资产文件的方法。使用 File(path).readAsString() 仅适用于 dart 控制台应用程序,使用 rootBundle 仅适用于 Flutter 包/应用程序。
我的问题是:如何直接从纯 dart 包中访问存储在 dart 包资产中的这个文件?
在颤振包中,我只需像这样通过 pubspec.yml 使文件可用
flutter:
assets:
- lib/assets/b737.json
但我无法为纯 dart 包找到类似的解决方案。
感谢任何帮助。
回答
经过长时间的研究和社区的大力帮助,这个功能似乎根本不存在。
但是有一些解决方法:
从 Flutter 项目加载并将读取字符串传递给 dart 包
通过rootBundle.loadString()从flutter项目中加载asset文件,并在flutterpubspec.yaml中指定asset文件,并将字符串数据传递给dart包。检查ch271828n's answer for details
让它成为一个颤振包
一个简单的解决方案是将纯 dart 包转换为颤振包。然后它就不再是纯飞镖了,但这并不总是有害的。尤其是在另一个 Flutter 项目/包中使用该包时。
将原始数据保存在变量中
除了提供资产文件并在运行时读取内容之外,您还可以直接将资产文件内容安全地保存到static const 变量中。但是,对于较大的资产,如果它从资产中索引数十万行,这可能会减慢您的 IDE。从分析器中排除这些文件可能会有所帮助:
analysis_options.dart
analyzer:
exclude:
- '**/assets/data/**'
阿斯彭包
您还可以查看aspen 包,该包可帮助解决之前的解决方案。您指定资产的路径,然后通过代码生成将这些文件的内容保存到可直接从代码中获得的变量中。
part 'assets.g.dart';
// @Asset is an annotation from package:aspen that marks the asset to be packed.
@Asset('asset:my_package/web/my-asset.txt')
// We create a const (it must be const!) value that holds the generated asset content.
const myTextAsset = TextAsset(text: _myTextAsset$content);
【问题讨论】:
标签: json flutter file dart assets