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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:48:02