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
相关产品推荐
相关产品推荐

