如何访问纯dart包中的资源文件?

Tob*_*obi 6 json assets file dart flutter

我编写了一个 dart 包,我的 flutter 应用程序正在使用它。在 dart 包内,我想将一些静态数据存储在 json 文件中,我想从 dart 包代码中读取这些数据。

但是我找不到直接从 dart 包访问资源文件的方法。使用File(path).readAsString()only 适用于 dart 控制台应用程序,使用rootBundleonly 适用于 flutter 包/应用程序。

我的问题是:如何直接从纯 dart 包访问存储在 dart 包资产中的这个文件?

在 flutter 包中,我只需通过 pubspec.yml 使文件可用,如下所示

flutter:
   assets:
      - lib/assets/b737.json
Run Code Online (Sandbox Code Playgroud)

但我找不到纯 dart 包的类似解决方案。

Tob*_*obi 1

解决方案总结

经过长期的研究和社区的大力帮助,这个功能似乎根本不存在。

但有一些解决方法:

从 Flutter 项目加载并将读取的字符串传递给 dart 包

通过 rootBundle.loadString() 从 flutter 项目加载 asset 文件,并在 flutter pubspec.yaml 中指定 asset 文件,并将字符串数据传递给 dart 包。查看 ch271828n 的答案了解详细信息

做成flutter包

一个简单的解决方案是将纯 dart 包转换为 flutter 包。那么它就不再是纯粹的飞镖了,但这并不总是有害的。特别是当该包在另一个 flutter 项目/包中使用时。

将原始数据保存在变量中

您还可以直接将资源文件内容保护到静态 const 变量,而不是提供资源文件并在运行时读取内容。然而,对于较大的资产,如果它索引资产中的数十万行,则可能会减慢 IDE 的速度。从分析器中排除这些文件可能会有所帮助:analysis_options.dart

analyzer:
  exclude:
    - '**/assets/data/**'
Run Code Online (Sandbox Code Playgroud)

白杨包

您还可以查看 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);
Run Code Online (Sandbox Code Playgroud)