如何解决Flutter中因使用!操作符触发的空检查错误
错误原因
你使用!操作符对sharedPreferences.getString('userData')的返回值强制非空断言,但该方法在userData对应键值从未存储、或者已被清理时会返回null,此时强制非空就会触发Dart空安全运行时异常。
修复方案
方案1:先判空再执行后续逻辑(最稳妥)
先读取存储值,确认非空后再执行解析逻辑,不存在的情况下直接跳过后续处理或者走默认初始化逻辑:
void initialGetSaved() async{ sharedPreferences = await SharedPreferences.getInstance(); // 先读取存储值,判断非空再处理 String? userDataStr = sharedPreferences.getString('userData'); if (userDataStr != null && userDataStr.isNotEmpty) { Map<String,dynamic> jsondatais = jsonDecode(userDataStr); var data = UserData.fromJson(jsondatais); // 赋值逻辑可根据实际需求调整 gender = ''; birthdate; // 注意这行是无效代码,建议根据需求补全赋值逻辑 height = ''; weight = ''; goal = ''; workout_per_week = ''; how_many_weeks = ''; meal_plan = ''; meal_category = ''; } else { // 可选:无存储值时走默认初始化逻辑 } }
方案2:空值兜底(适合需要默认值的场景)
用??操作符给空返回值兜底,给一个默认的合法JSON字符串,保证永远不会出现空值:
// 空值时返回空对象的JSON字符串,避免非空断言报错 Map<String,dynamic> jsondatais = jsonDecode(sharedPreferences.getString('userData') ?? '{}');
注意:该方案如果兜底空对象,需要保证
UserData.fromJson方法支持解析空Map对象,否则依然会抛出解析异常。
内容的提问来源于stack exchange,提问作者Gheh
相关产品推荐
相关产品推荐

