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
相关产品推荐
相关产品推荐

