Flutter调用休假统计API出现int非String子类型、500错误问题求助
错误原因与修复方案
- 存储阶段类型不匹配: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
相关产品推荐
相关产品推荐

