You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件被当成无用资源清除:
    1. 在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" />
  1. 也可以临时把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:06:05