Flutter Release版本运行异常,APK装真机部分页面失效如何解决?
常见原因及解决方案
- 检查安卓网络权限配置
调试模式下Flutter默认会给应用加INTERNET权限,但是release打包需要手动在安卓项目的android/app/src/main/AndroidManifest.xml里添加权限声明,位置在<manifest>标签下、<application>标签外:
<uses-permission android:name="android.permission.INTERNET" />
- 处理明文HTTP请求限制
如果你的接口请求用的是HTTP而非HTTPS,安卓9(API level 28)及以上默认禁止明文流量请求,需要在<application>标签里添加属性:
<application android:usesCleartextTraffic="true" ...其余原有配置保持不变 >
- 补全FutureBuilder的错误处理逻辑
你当前的代码只判断了数据加载完成和加载中两种状态,没有处理请求异常的场景,如果getParentCategoryList方法抛出了异常(比如数据解析失败、网络请求失败),页面会一直停留在加载动画状态,看不到具体报错。可以修改代码如下:
searchFlag ? SearchResultsListView(searchText) : Expanded( child: FutureBuilder( future: getParentCategoryList(context), builder: (context, data) { if (data.hasData) { return CategoryGridView(data.data); } else if (data.hasError) { // 此处可打印错误日志方便排查,也可直接把错误信息展示在页面上定位问题 return Center( child: Text("加载失败:${data.error.toString()}"), ); } else { return Center( child: CircularProgressIndicator(), ); } }, ), ),
检查Release打包的混淆配置
如果你开启了R8代码压缩/混淆,没有给数据解析用到的实体类配置keep规则的话,打包后实体类的字段名会被重命名,导致JSON解析失败拿不到数据。需要在android/app/proguard-rules.pro里添加对应实体类的keep规则,或者使用json_serializable这类自动生成解析代码的库避免手动解析的混淆问题。排查接口访问限制
确认真机和模拟器是否在同一个网络环境,后端有没有做IP白名单限制,导致真机无法访问你的后端接口。
内容的提问来源于stack exchange,提问作者satheesh ck
相关产品推荐
相关产品推荐

