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

Flutter空安全下调用SharedPreferences方法出现两类报错如何解决

错误原因分析

  • 第一个参数缺失报错:你定义的getUserNameSharedPreference方法需要传入1个布尔类型的位置参数isUserLoggedIn,但你调用时没有传入任何参数,因此触发参数不匹配错误。注意你当前的方法实现里并没有用到这个isUserLoggedIn参数,属于冗余参数。
  • 第二个空类型赋值报错:SharedPreferences.getString()返回的是可空类型String?,如果对应的key不存在就会返回null,你直接把它赋值给非空类型的Constants.myName,不符合空安全校验规则,即使加!强制拆包,也需要先保证参数调用正确才能执行到拆包逻辑。

修复方案

方案1:删除冗余参数(推荐,当前实现未用到该参数)

修改HelperFunctions类中的方法定义,删掉无用的isUserLoggedIn参数:

class HelperFunctions{
  static String sharePreferenceUserNameKey = "USERNAMEKEY"; 
  // 移除多余的bool类型入参
  static Future<String?> getUserNameSharedPreference() async{
     SharedPreferences prefs = await SharedPreferences.getInstance();
     return await prefs.getString(sharePreferenceUserNameKey);
  }    
}

调用时处理空安全赋值,不要直接用!强制拆包避免运行时崩溃,建议设置默认值:

getUserInfo() async{
  // 当获取到的值为null时,赋值默认空字符串
  Constants.myName = (await HelperFunctions.getUserNameSharedPreference()) ?? "";
}

如果你的业务逻辑能保证这个key一定存在不会返回null,也可以用!强制拆包,但不推荐这种写法。

方案2:保留参数,调用时传入对应布尔值

如果该参数后续有使用计划不想删除,调用方法时传入业务对应的布尔值即可,同时处理空类型:

getUserInfo() async{
  // 传入实际业务对应的布尔值,比如用户是否已登录的状态值
  Constants.myName = (await HelperFunctions.getUserNameSharedPreference(true)) ?? "";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:27:01