Flutter自定义StorageUtil调用SharedPreferences报空值校验错误如何解决
问题诱因分析
错误的核心是_preferences变量在你调用addStringtoSF方法时还处于未初始化的null状态,具体诱因分为三类:
- 异步初始化逻辑未正确等待
getInstance方法是异步返回的Future对象,初始化SharedPreferences实例需要等待磁盘IO操作完成,如果你在调用时没有添加await关键字就直接获取StorageUtil实例调用存储方法,此时_preferences还没完成赋值,使用!强制断言null就会触发报错。 - 调用时可空参数存在隐式转换风险
你传入的userResponse是String?可空类型,而addStringtoSF方法要求传入不可空的String类型,虽然你确认参数可以正常接收,但如果json.encode返回null时也会触发类型异常,属于潜在隐患。 - 工具类无空校验兜底逻辑
存储方法中直接对_preferences使用!强制非空断言,没有做非空判断的兜底处理,只要变量未初始化就一定会抛出空错误,没有容错空间。
快速修复方案
正确调用示例
// 必须await等待初始化完成再获取实例 final _storageUtil = await StorageUtil.getInstance(); String? userResponse = json.encode(authResponse); print('This is userResponse type'); // 先对可空参数判空再调用方法 if (userResponse != null && _storageUtil != null) { await _storageUtil.addStringtoSF('userData', userResponse); }
工具类优化示例
class StorageUtil { static StorageUtil? _storageInstance; static SharedPreferences? _preferences; static Future<StorageUtil> getInstance() async { _storageInstance ??= StorageUtil(); _preferences ??= await SharedPreferences.getInstance(); return _storageInstance!; } Future<void> addStringtoSF(String key, String value) async { print(' inside sharedPreferences file $key $value'); // 增加非空兜底,未初始化就先完成初始化再操作 _preferences ??= await SharedPreferences.getInstance(); await _preferences?.setString(key, value); } }
内容的提问来源于stack exchange,提问作者Febin Johnson
相关产品推荐
相关产品推荐

