如何修复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
相关产品推荐
相关产品推荐

