Flutter CRON/TIMER/STATE在Android非调试环境下不生效问题求助
可行解决方案
- 优先检查Android网络权限配置
本地调试时Android会默认给应用赋予网络权限,但release打包不会默认携带该权限。需要在android/app/src/main/AndroidManifest.xml的manifest节点下添加权限声明:
<uses-permission android:name="android.permission.INTERNET" />
如果应用targetSdkVersion≥28,还需确认网络安全策略配置正常,避免系统拦截请求。
- 给HTTP逻辑添加异常捕获与判空处理
你当前的代码没有任何异常捕获、状态码校验、字段判空逻辑,只要实体机/NOX环境下出现网络不通、请求超时、证书校验失败、接口返回字段异常等问题,都会直接抛出异常中断执行,后续setState和snackbar逻辑完全不会触发。可参考修改逻辑:
void _getTime() async { try { var url = Uri.https('my_api_site.com', '/api/date', {'q': '{http}'}); var response = await http.get(url); // 先校验请求状态码 if (response.statusCode == 200) { var jsonResponse = convert.jsonDecode(response.body); // 对返回字段做判空,避免格式异常 if (jsonResponse['hour'] != null && jsonResponse['minute'] != null) { setState(() { time = int.parse(jsonResponse['hour'].toString() + jsonResponse['minute'].toString()); }); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Timestamp: $time')), ); } else { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('接口返回字段缺失')), ); } } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('请求失败,状态码:${response.statusCode}')), ); } } catch (e) { // 捕获所有异常并提示,方便定位问题 ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('请求异常:$e')), ); } }
- 检查release包混淆配置
如果打包时开启了代码混淆,需要确认你已经给HTTP请求库、JSON解析逻辑配置了正确的保留规则,避免混淆后字段映射出错导致解析失败。可以先关闭混淆打包测试,验证是否是混淆导致的问题。 - 验证接口SSL证书有效性
如果你的接口使用了自签名SSL证书,Android实体机默认不会信任该证书,会直接拦截HTTPS请求,而本地模拟器可能因为提前安装了根证书可以正常访问。这种情况需要配置应用的网络安全规则信任对应证书,或是更换为权威机构签发的SSL证书。
内容的提问来源于stack exchange,提问作者Jim Odelid
相关产品推荐
相关产品推荐

