You need to enable JavaScript to run this app. Flutter调用休假统计API出现int非String子类型、500错误问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Flutter调用休假统计API出现int非String子类型、500错误问题求助

问题1:SharedPreference存储/读取时报类型错误

错误原因与修复方案

  • 存储阶段类型不匹配:API返回的leaves、maternity字段均为int类型,你在赋值时只给sick、annual字段加了toString()转换,剩下两个字段直接把int值赋值给了String类型变量,因此抛出type 'int' is not a subtype of type 'String'错误。
    修正Dio请求回调中的代码即可:
// 补充toString()转换
String maternityCount = (onResponse.data['maternity']).toString();
String totalleaveCount = (onResponse.data['leaves']).toString();
  • 读取阶段空值未处理:SharedPreferences.getString()返回的是可空类型String?,如果前期存储失败,读取到的值就是null,直接赋值给非空String变量、或者直接调用int.parse()都会触发错误。
    修正Dashboard页面的读取逻辑,增加空值兼容:
String sickcount = "";
_userDetails() async {
  SharedPreferences myPrefs = await SharedPreferences.getInstance();
  setState(() {
    // 取不到值时用空字符串做默认值
    sickcount = myPrefs.getString('sickcount') ?? "";
    // 转int前先判断字符串非空
    if(sickcount.isNotEmpty) {
      print(int.parse(sickcount));
    }
    print(sickcount);
    print(sickcount.toString());
  });
}
问题2:休假页面initState调用API时报500错误

错误原因与修复方案

JWT验证失败抛出的错误对象不一定携带expiredAt字段:只有token过期的错误才会包含该字段,如果是token为空、签名错误、token无效等其他验证错误,err.expiredAt就是undefined,直接调用toLocaleString()就会抛出空指针错误。
修正后端的错误处理逻辑,增加字段存在判断:

if(err) {
  // 先判断expiredAt存在再做转换
  if(err.expiredAt) {
    err["expiredAt"] = err["expiredAt"].toLocaleString();
  }
  res.status(300).json(err)
}

额外排查点:刚跳转页面时initState触发过早,可能此时token还没从本地存储读取完成,请求时传了空token也会触发JWT验证失败,可以给接口调用加延迟,或者等token初始化完成后再发起请求。

内容的提问来源于stack exchange,提问作者TimeToCode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 08:21:00