如何加载资源文件或包:Dart中的URI?

Gün*_*uer 4 dart

有一种方法可以获取当前正在执行的脚本的路径,然后找到相对于此位置的资源文件,但无法保证在发布应用程序时目录结构相同.

Dart是否提供了一种通用的方式来加载资源(文件,数据......)的方式也适用于pub runpub global run

问另一种方法,如何package:在运行时动态加载Dart应用程序中的URI 内容?

Gün*_*uer 5

更新资源包已经出版.

更新 这正在重做.该Resource班将被移动到一个包.

原版的

ResourceDart中有一个新类(测试过Dart VM version: 1.12.0-edge.d4d89d6f12b44514336f1af748e466607bcd1453 (Fri Aug 7 19:38:14 2015))

resource_example/lib目录/资源/ sample.txt的

Sample text file.
Run Code Online (Sandbox Code Playgroud)

resource_example /斌/ main.dart

main() async {
  var resource = const Resource('package:resource_example/resource/sample.txt');
  print(await resource.readAsString());
  // or for binary resources
  // print(await resource.readAsBytes());
}
Run Code Online (Sandbox Code Playgroud)

执行

dart bin/main.dart
Run Code Online (Sandbox Code Playgroud)

版画

Sample text file.
Run Code Online (Sandbox Code Playgroud)

执行

pub global activate -spath . 
pub global run resource_example:main
Run Code Online (Sandbox Code Playgroud)

还打印

Sample text file.
Run Code Online (Sandbox Code Playgroud)

也可以将变量的内容作为资源传递.例如,这可能在单元测试中方便传递模拟资源.

const sampleText = "Sample const text";

main() async {
  var uriEncoded = sampleText.replaceAll(' ', '%20');
  var resource = new Resource('data:application/dart;charset=utf-8,$uriEncoded');
  print(await resource.readAsString());
}
Run Code Online (Sandbox Code Playgroud)

也支持任意文件或http uris,但在使用pub runpub global run使用相对路径时可能无法使用.

main() async {
  var uri = new Uri.file('lib/resource/sample.txt');
  var resource = new Resource(uri.toString());
  print(await resource.readAsString());
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅
- http://blog.sethladd.com/2015/08/dynamically-load-package-contents-with.html
- https://codereview.chromium.org/1276263002/

  • 刚试过。还不能工作:`无法在 file:///Users/sethladd/.pub-cache/global_packages/resourcetest/bin/resourcetest.dart.snapshot` 处解析 base 的包位置 (2认同)