Flutter模拟器请求API正常 真机安装APK后空白屏报300错误如何解决
问题现象
- 使用
ListView.builder展示API拉取的列表数据,模拟器运行完全正常,打包APK安装到安卓真机后页面空白,Leave History标签下无数据展示 - 真机运行效果图:

- 模拟器运行效果图:

- 侧边栏跳转进入该页面时,
catchError捕获错误:DioError [DioErrorType.response]: Http status error [300],但真机通过数据线连接电脑调试时运行正常
排查步骤
1. 网络配置问题(对应300报错)
- 检查接口地址配置:模拟器上使用
localhost/127.0.0.1默认指向开发电脑,真机安装APK后访问localhost是指向真机本身,自然找不到接口。将接口地址localhostUrlLeaveHistoryON改为开发电脑的局域网IP(格式如192.168.xx.xx),测试时确保真机和电脑处于同一WiFi环境。 - 检查安卓网络权限:在
android/app/src/main/AndroidManifest.xml的<manifest>标签下添加网络权限配置,debug模式会默认附带该权限,release打包不会自动添加,是连接调试正常、单独装APK异常的常见原因:
<uses-permission android:name="android.permission.INTERNET" />
- 如果你用的是HTTP(非HTTPS)接口,安卓9及以上系统默认禁止明文HTTP请求,需要额外配置:
在android/app/src/main/res/xml下新建network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config>
然后在AndroidManifest.xml的<application>标签添加属性:
android:networkSecurityConfig="@xml/network_security_config"
- 配置Dio支持重定向:300属于重定向类状态码,初始化Dio的时候添加配置即可自动跟随重定向:
Dio dio = Dio(BaseOptions( followRedirects: true, maxRedirects: 3, ));
2. 布局逻辑问题
当前代码存在布局错误,调试模式下可能忽略警告正常运行,release模式会直接导致列表不显示:
Expanded组件只能放在Row/Column/Flex的子节点下,你当前把Expanded作为Container的直接子节点属于无效用法,会触发布局异常。修改方案:把外层的Container换成Column,或者直接移除Expanded(你已经给ListView.builder加了shrinkWrap: true属性,不需要嵌套Expanded)。- 全局变量
historyList没有清空逻辑,每次进入页面都会重复添加数据,建议把historyList和loader都改成_getRecord方法内的局部变量,不要用全局状态存储,避免数据污染。 FutureBuilder的future参数每次页面build都会重新发起请求,建议把_getRecord()的返回值存在State的变量里,页面初始化的时候调用一次即可,避免重复请求。
3. 其他可选排查点
- 打包release APK如果开启了混淆,要给实体类
leaveHistory添加混淆规则,否则序列化的时候可能取不到字段值,导致列表空白。 - 检查接口返回的字段名大小写是否和代码里取值的一致,比如代码里取
historyData["Date"],如果接口返回的是小写date,调试模式可能兼容读取,release模式会取不到值。
内容的提问来源于stack exchange,提问作者TimeToCode
相关产品推荐
相关产品推荐

