Flutter应用打包APK后API数据加载失败(用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

