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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:24:06