Flutter 如何一次性获取assets文件夹下所有文件并存入List
解决方案
第一步:优化pubspec.yaml配置
首先你不需要逐个罗列xml文件路径,直接在pubspec.yaml的flutter/assets节点下配置文件夹路径即可,后续新增xml文件不需要再修改pubspec:
flutter: assets: - assets/data/
注意末尾要加斜杠,代表引用整个文件夹下的所有资源
第二步:实现批量读取assets下xml的getXmlData函数
assets属于应用打包内置的资源,不能用文件系统的File类读取,需要通过rootBundle配合AssetManifest获取所有资源路径后筛选处理,代码如下:
import 'package:flutter/services.dart'; import 'package:xml/xml.dart'; import 'package:path/path.dart' as p; // 假设checkListtemplateXmlList是你定义的全局/类成员存储列表 List<XmlDocument> checkListtemplateXmlList = []; static Future<void> getXmlData() async { // 加载资产清单,获取所有内置资源路径 final assetManifest = await AssetManifest.loadFromAssetBundle(rootBundle); final allAssetPaths = assetManifest.listAssets(); // 筛选出assets/data目录下的xml文件 final xmlAssetPaths = allAssetPaths.where((path) { return path.startsWith('assets/data/') && p.extension(path) == '.xml'; }); // 逐个读取解析xml for (final xmlPath in xmlAssetPaths) { final xmlString = await rootBundle.loadString(xmlPath); final xmlFile = XmlDocument.parse(xmlString); checkListtemplateXmlList.add(xmlFile); } }
注意事项
- 每次新增xml文件后,需要重新执行
flutter run才能加载新的资源,热重载不会更新资产清单 - 如果需要获取xml的文件名,可以用
p.basenameWithoutExtension(xmlPath)提取,和你之前处理json的逻辑一致
内容的提问来源于stack exchange,提问作者GDTyka
相关产品推荐
相关产品推荐

