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

如何修复NoSuchMethodError: 方法'[]'在null上被调用的问题

问题分析与解决方案

你的报错和预期不符的问题,根源是两个关键错误:


1. 错误访问目标Map的方式

你在处理Stress时写了_states[i]["Stress"],但_states是以字符串为键的Map,不是List,用索引i去访问会返回null,再调用["Stress"]就会触发NoSuchMethodError: The method '[]' was called on null——你误以为是shortcut["Stress"]的问题,其实是这里的代码先抛出了错误。

2. 错误的数据源路径

states[i]["Stress"]永远取不到值,因为Stress字段是嵌套在states[i]["states"]这个子Map里的,不是直接在states[i]的顶级结构下,所以这个判断永远为null,导致你往_states["Stress"]里添加的都是0,达不到预期的[1,1]。


修正后的完整代码

_addUpAndGetPercentage(List states) {
  Map<String, dynamic> _states = {
    "Stress": [],
    "Fatigue": [],
    "Anxiety": [],
    "Relaxation": [],
    "Involvement": []
  };

  log("states === $states");

  for (int i = 0; i < states.length; i++) {
    var currentStates = states[i]["states"]; // 重命名变量提升可读性
    log("current states ==== ${currentStates.toString()}");

    // 处理Stress:从嵌套的states子Map取值
    _states["Stress"].add(currentStates["Stress"] ?? 0);

    // 处理Anxiety
    _states["Anxiety"].add(currentStates["Anxiety"] ?? 0);

    // 处理Involvement
    _states["Involvement"].add(currentStates["Involvement"] ?? 0);

    // 处理Relaxation
    _states["Relaxation"].add(currentStates["Relaxation"] ?? 0);

    // 处理Fatigue:合并原数据中的两类疲劳值
    int fatigueValue = (currentStates["Chronic Fatigue"] ?? 0) + (currentStates["Slight Fatigue"] ?? 0);
    _states["Fatigue"].add(fatigueValue);
  }

  log("_states ===== ${_states.toString()}");
  return _states;
}

关键修正点

  • 将_states[i]["Stress"]改为_states["Stress"],直接通过字符串键访问目标数组
  • 所有状态值都从currentStates(原代码的shortcut)中获取,因为它们都嵌套在states[i]["states"]下
  • 使用Dart的??空合并运算符简化代码,替代繁琐的if-else判断
  • 针对Fatigue字段,合并了原数据中的Chronic Fatigue和Slight Fatigue的值(可根据实际需求调整)

修改后,_states["Stress"]会得到预期的[1,1],Relaxation等字段也不会再出现null错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:35:24