Flutter应用安卓模拟器运行正常,实体机运行或打包APK后JSON文件加载失败
排查解决步骤
- 首先校验
pubspec.yaml中的资源声明配置,确保缩进、路径完全正确,示例配置如下:
flutter: # 注意assets层级要和flutter平级缩进2格,每个资源路径前面的-后要加空格,路径和实际文件完全匹配 assets: - assets/diys.json
重点注意大小写匹配:安卓模拟器默认对路径大小写不敏感,实体安卓设备的文件系统严格区分大小写,如果你实际的文件名/文件夹名是Assets或者Diys.json,和代码里的路径大小写不一致,就会出现模拟器正常、实体机找不到资源的问题。
- 检查release打包配置是否误删了资源:打开
android/app/build.gradle文件,查看buildTypes下的release配置,如果开启了shrinkResources true(资源压缩),需要添加资源保留规则,避免json文件被当成无用资源清除:- 在
android/app/src/main/res/下新建raw文件夹,创建keep.xml文件,写入以下内容:
- 在
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@raw/*,@assets/*.json" />
- 也可以临时把
shrinkResources改为false测试,如果测试正常就说明是资源压缩导致的问题。
- 增加异常捕获定位具体问题:修改你的加载代码,打印具体的报错信息,方便定位根因,示例修改如下:
FutureBuilder( future: () async { try { return await DefaultAssetBundle.of(context).loadString('assets/diys.json'); } catch (e, stack) { // 这里可以打印日志看具体报错是找不到文件还是其他问题 debugPrint('加载json失败: $e, 堆栈: $stack'); rethrow; } }(), // 其余builder逻辑保持不变 );
- 备选加载方案:可以尝试用全局的
rootBundle加载资源,避免上下文导致的加载异常,代码示例:
// 先导入services包 import 'package:flutter/services.dart'; // 加载代码改为 future: rootBundle.loadString('assets/diys.json')
内容的提问来源于stack exchange,提问作者Luke Talyor
相关产品推荐
相关产品推荐

