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

Flutter调用SharedPreferences取Int值启动时出现_CastError空值报错

问题根因

  • _loadCounterH是异步方法,initState调用该方法时不会等待异步逻辑执行完成,你执行_pktH!判断的代码会在SharedPreference读取完成前先执行,此时_pktH仍为初始的null值,强制用!解包就会触发你遇到的空校验错误。
  • 你虽然在异步逻辑里给_pktH设置了兜底值0,但这部分逻辑执行晚于判断逻辑,所以启动时会触发报错。

解决方案

方案1:给_pktH设置初始默认值(最适配你的需求)

直接把声明改为非可空类型,初始值设为你期望的0,后续使用不需要强制解包:

// 原声明
// int? _pktH;
// 修改为
int _pktH = 0;

// 后续判断逻辑去掉!即可
if (_pktH >= 2835) {
  _abzeichenH = ' ' + ' \u{1F451}' + ' ' + 'Ingenieur/-in';
} 
// 其余判断逻辑保持不变

方案2:添加初始化加载态

如果你的判断逻辑写在build方法中,可以先判断_pktH是否为空,为空时展示启动加载页,初始化完成后再渲染业务逻辑:

@override
Widget build(BuildContext context) {
  if (_pktH == null) {
    return const Center(child: CircularProgressIndicator());
  }
  // 原有业务逻辑
}

方案3:判断逻辑添加空值兜底

不需要修改_pktH的声明,取值时做一层空值兜底:

// 为空时默认取0,不需要强制解包
int currentPktH = _pktH ?? 0;
if (currentPktH >= 2835) {
  _abzeichenH = ' ' + ' \u{1F451}' + ' ' + 'Ingenieur/-in';
} 
// 其余判断都用currentPktH即可

额外注意点

  • 现有代码里print(Text("Save number is: $_counterH"));写法有误,Text是Flutter的UI组件,不能直接传入print方法输出内容,改为print("Save number is: $_counterH")即可正常打印数值。
  • _loadCounterH里读取完数值之后不需要立刻调用setInt写回SharedPreference,仅在数值发生变化时写回即可,可减少不必要的IO操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:39:04