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

Flutter Dart出现The getter 'vacTotal' was called on null错误求解

该问题和初始化{"Global": new CountryDataVac()}的写法无关,问题核心出在以下两点:

1. 变量遮蔽导致初始化的Map被覆盖

你在main.dart的getCountryDataVac静态方法内部,重新声明了一个同名的局部空Map:

static Map<String, CountryDataVac> getCountryDataVac(String body, var countryname) {
  Map<String, CountryDataVac> countryDataVac = {}; // 这行代码遮蔽了外部已经初始化的带Global键的Map
  // 后续逻辑
}

这个局部空Map会覆盖你外部预先初始化好、带"Global"默认值的Map对象。当你用动态生成的键赋值后,如果取值逻辑拿到的是这个空Map,或者取值的键未被正确写入,就会返回null,调用null的vacTotal属性就会抛出对应错误。
硬编码写法能正常运行,是因为你硬编码赋值后马上用同一个硬编码键取值,刚好命中了这个局部空Map里写入的键,所以不会报错。

2. 国家名转换逻辑可能存在异常

你使用的capitalize函数如果实现有问题,会导致转换后的国家名和你预期的Germany不一致,比如出现大小写不匹配、残留特殊字符、多空格等问题,最终Map键不匹配返回null。

解决步骤

  1. 删除getCountryDataVac方法内部重复声明的局部countryDataVac变量,直接使用外部预先初始化的Map对象,避免覆盖。
  2. 加日志验证国家名转换结果是否符合预期,确认转换后的键和你硬编码的Germany完全一致:
String processedKey = capitalize(countryname).replaceAll("/", "");
// 验证转换结果是否正确
print("转换后的键:$processedKey,匹配验证结果:${processedKey == "Germany"}");
countryDataVac[processedKey] = parseRowVac(usera.vacTotal,usera.vacDaily,usera.vactotalPerHundred,usera.vacdailyPerMillion);
  1. 取值前增加判空兜底逻辑,避免空指针异常:
CountryDataVac? targetData = countryDataVac["Germany"] ?? countryDataVac["Global"];
// 后续使用targetData的属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:45:03