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

Flutter应用打包APK后API数据加载失败(用FutureBuilder,模拟器正常)

Flutter打包APK后FutureBuilder数据为空的常见原因
  • 网络权限未配置:模拟器通常默认放开网络权限,但真机必须在AndroidManifest.xml里声明网络权限。检查文件里有没有加<uses-permission android:name="android.permission.INTERNET"/>和<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>,release包很容易漏掉这一步。

  • 明文HTTP请求被拦截:Android 9及以上系统默认禁止明文HTTP请求,模拟器可能没严格校验,但真机调用HTTP协议的API会直接失败。要么把API换成HTTPS,要么在android/app/src/main/res/xml创建network_security_config.xml,配置允许指定域名的明文请求,再在AndroidManifest.xml的application标签里引用这个配置。

  • 代码混淆破坏序列化:release模式默认开启代码混淆,如果你的数据模型类被混淆,JSON解析(比如用Gson、JsonSerializable)会失败,导致返回null。打开proguard-rules.pro,给你的模型类添加混淆豁免规则,比如:

    -keep class com.yourapp.models.** { *; }
    

    把com.yourapp.models换成你实际的模型类包路径。

  • FutureBuilder未处理错误状态:模拟器请求一直成功,你可能没写错误分支,但真机请求失败时,snapshot.hasError为true,这时候直接访问snapshot.data就会拿到null。补全错误处理逻辑:

    FutureBuilder(
      future: fetchData(),
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return Text('请求出错: ${snapshot.error}');
        }
        if (snapshot.connectionState == ConnectionState.waiting) {
          return CircularProgressIndicator();
        }
        // 正常展示数据的逻辑
      },
    )
    
  • API地址不对:如果模拟器用的是本地测试地址(比如10.0.2.2对应电脑的localhost),真机根本访问不到这个地址。换成公网可访问的API地址,或者确保真机和电脑在同一局域网,用电脑的局域网IP作为API地址。

  • 没看release模式的错误日志:release模式默认关闭debug日志,你看不到具体哪里错了。可以用flutter run --release把app装到真机上运行,查看控制台输出的错误信息,精准定位问题。

内容的提问来源于stack exchange,提问作者Ibnul Hossain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:15:36