You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter自定义package中assets加载失败,如何正确配置?

自定义Flutter包中正确存放和加载Assets的方法

问题场景

项目目录结构:

./assets
./lib
./pubspec.yaml
./packages/features/the_feature/assets
                               /lib
                               /pubspec.yaml

在the_feature包的assets目录下添加data.json,并在包的pubspec.yaml中声明:

flutter:
  assets:
    - assets/data.json

尝试通过以下代码加载时出现错误:Unable to load asset: '...' The asset does not exist or has empty data.

Future<Map<String, dynamic>> loadDataJson() async {
    final jsonString = await rootBundle.loadString('assets/data.json');
    final jsonList = json.decode(jsonString) as Map<String, dynamic>;

    return jsonList;
}

将资产移到主项目./assets目录则可正常加载,需解决自定义包内资产的加载问题。

解决方案

1. 保留自定义包内的资产配置

包内的pubspec.yaml无需修改,继续保持原有声明:

flutter:
  assets:
    - assets/data.json

2. 主项目中显式引用包内资产

在主项目的pubspec.yaml中,添加对包内资产的引用,路径格式为packages/<包名>/<资产相对路径>:

flutter:
  assets:
    # 主项目原有资产(如果有)
    - assets/
    # 引用自定义包内的资产
    - packages/the_feature/assets/data.json

3. 修改包内代码的加载路径

在the_feature包的加载代码中,使用包含包名前缀的完整路径访问资产:

import 'dart:convert';
import 'package:flutter/services.dart';

Future<Map<String, dynamic>> loadDataJson() async {
    // 注意路径前缀:packages/the_feature/
    final jsonString = await rootBundle.loadString('packages/the_feature/assets/data.json');
    final jsonData = json.decode(jsonString) as Map<String, dynamic>;

    return jsonData;
}

原理说明

Flutter的资源打包系统默认仅处理主项目声明的资产,自定义包内的资产不会自动被纳入打包范围。必须在主项目中显式引用包内资产,同时加载时通过packages/<包名>/前缀指定资源所属的包,这样rootBundle才能正确定位到包内的资产文件。

内容的提问来源于stack exchange,提问作者xplat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:32:19