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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:00:00