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

