如何访问包中的资产

问题描述

最初的问题来自颤抖issue 32799

我开发了一个dart程序包,我需要在运行时加载一些json文件,但是当我这样做时会出现错误。加载图片没问题,代码

void main() {
  Future<void> loadAsset() async {
    String value = await rootBundle
        .loadString('lib/src/assets/JsonConfig/test.json');

    //Image img = Image.asset('lib/src/assets/default-logo.png');
  }

  test('adds one to input values',() async {
    await loadAsset();
  });
}

我的pubspec.yaml文件是这样的:

Flutter:
  # To add assets to your package,add an assets section,like this:
   assets:
   - lib/src/assets/default-logo.png
   - lib/src/assets/JsonConfig/test.json
   - lib/src/assets/

解决方法

要从包中加载资产,您应为密钥添加前缀'packages/<package_name>/',以使其生效。

例如AssetImage的行为

/// The name used to generate the key to obtain the asset. For local assets
/// this is [assetName],and for assets from packages the [assetName] is
/// prefixed 'packages/<package_name>/'.
String get keyName => package == null ? assetName : 'packages/$package/$assetName';

https://github.com/flutter/flutter/blob/fba99f6cf9a14512e461e3122c8ddfaa25394e89/packages/flutter/lib/src/painting/image_resolution.dart#L146

因此,为密钥添加前缀'packages/<package_name>/'可以在上面的演示中使用:

String value = await rootBundle
     .loadString('packages/<package_name>/lib/src/assets/JsonConfig/test.json');