Flutter无法找到pubspec.yaml已配置路径的资源文件如何解决
Flutter资源读取报错排查方案
首先定位显性错误
- 路径拼写不匹配:你代码中写的读取路径为
lib/asset/treatments.txt,但报错日志显示程序实际查找的路径是lib/assets/treatments.txt,asset和assets单复数不一致,先统一代码路径、本地实际文件夹名、pubspec声明路径三者的拼写,注意大小写也要完全匹配。
核心用法错误修正
直接用
dart:io的File类传入相对路径读取资源的方式是错误的。File类操作的是设备本地文件系统的路径,而pubspec.yaml中声明的资源会被打包进应用的Asset Bundle,不会以开发阶段的目录结构存放在设备文件系统中,自然会触发文件不存在的错误。
正确实现步骤
- 核对pubspec.yaml配置,注意缩进必须严格对齐(YAML对缩进敏感度极高),参考配置如下:
flutter: uses-material-design: true # assets字段必须和uses-material-design保持同级缩进 assets: - lib/asset/treatments.txt
- 配置修改完成后执行
flutter pub get,完全终止当前运行的应用后重新冷启动,热重载、热重启都不会加载新声明的打包资源。 - 使用Flutter官方提供的
rootBundle读取打包资源,参考代码:
import 'package:flutter/services.dart' show rootBundle; import 'dart:convert'; void executeTreatments() async { // 直接读取资源文本内容 final String fileContent = await rootBundle.loadString('lib/asset/treatments.txt'); // 按行拆分处理 LineSplitter.split(fileContent).forEach((line) => print(line)); }
如果业务场景必须使用File对象操作资源,需要先将打包内的资源拷贝到应用可访问的本地目录,再生成对应的File实例,参考实现:
import 'package:path_provider/path_provider.dart'; import 'package:flutter/services.dart' show rootBundle; import 'dart:io'; Future<File> getLocalAssetFile(String assetPath) async { final tempDir = await getTemporaryDirectory(); final targetFile = File('${tempDir.path}/treatments.txt'); final assetByteData = await rootBundle.load(assetPath); await targetFile.writeAsBytes(assetByteData.buffer.asUint8List()); return targetFile; }
额外排查项
- 检查pubspec.yaml的缩进:
flutter、assets、具体资源路径三者的缩进层级必须正确,缩进错误会导致资源根本不会被打包进安装包。 - 检查本地文件存放位置:确认
treatments.txt确实存放在你声明的对应路径下,没有放错文件夹。
内容的提问来源于stack exchange,提问作者mctracy
相关产品推荐
相关产品推荐

