Flutter读取JSON文件报错OS Error: No such file or directory(errno=2)求助
问题排查与修复方案
问题原因
- 路径逻辑错误:你用
getApplicationDocumentsDirectory()获取的是应用的私有文档存储目录(路径为/data/user/0/(censored)/app_flutter),但你的equipment_care.json是放在项目源码的lib/layers目录下,这两个目录完全无关,所以拼接后的路径必然找不到文件。 - 未配置静态资源:项目源码中的静态文件需要通过Flutter的asset机制配置,否则打包时不会被包含到应用安装包中,运行时自然无法访问。
修复步骤
1. 配置pubspec.yaml,将json文件声明为asset
在项目根目录的pubspec.yaml文件中,找到flutter节点,添加assets配置(注意缩进要和同级节点一致):
flutter: # 保留原有配置(如uses-material-design等) assets: - lib/layers/equipment_care.json
配置完成后执行flutter pub get使配置生效。
2. 修改代码,通过rootBundle读取asset资源
替换原来的文件读取逻辑,使用Flutter的rootBundle读取打包后的静态资源:
import 'package:flutter/services.dart' show rootBundle; // 替换原有的readCounter方法 Future<String> readEquipmentCareData() async { try { // 直接读取asset路径下的文件 final String jsonContent = await rootBundle.loadString('lib/layers/equipment_care.json'); return jsonContent; } catch (e) { print('读取失败: $e'); return ""; } } @override Widget build(BuildContext context) { readEquipmentCareData().then((value) { print(value); }); return Container( child: Scaffold( appBar: _appBar(), body: _body(), ), ); }
补充说明
如果你的需求是需要修改这个json文件的内容(而非仅读取静态数据),则需要先将asset中的文件复制到getApplicationDocumentsDirectory()对应的目录,之后再通过File类操作:
- 先通过rootBundle读取asset内容
- 将内容写入到文档目录的对应文件中
- 后续读写操作针对文档目录的文件
但从你的场景来看,只是为了存放静态数据优化代码可读性,直接使用asset方案更简单高效。
内容的提问来源于stack exchange,提问作者Gabi Mangili
相关产品推荐
相关产品推荐

