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。
解决步骤
- 删除
getCountryDataVac方法内部重复声明的局部countryDataVac变量,直接使用外部预先初始化的Map对象,避免覆盖。 - 加日志验证国家名转换结果是否符合预期,确认转换后的键和你硬编码的
Germany完全一致:
String processedKey = capitalize(countryname).replaceAll("/", ""); // 验证转换结果是否正确 print("转换后的键:$processedKey,匹配验证结果:${processedKey == "Germany"}"); countryDataVac[processedKey] = parseRowVac(usera.vacTotal,usera.vacDaily,usera.vactotalPerHundred,usera.vacdailyPerMillion);
- 取值前增加判空兜底逻辑,避免空指针异常:
CountryDataVac? targetData = countryDataVac["Germany"] ?? countryDataVac["Global"]; // 后续使用targetData的属性
内容的提问来源于stack exchange,提问作者osunkaya
相关产品推荐
相关产品推荐

