Flutter使用Map<String,bool>取值判断时Null无法转bool错误如何解决
问题原因
Dart 中 Map 的下标访问运算符 [] 返回值默认是可空类型,即便你声明的 Map<String, bool> 明确值为非空 bool 类型,只要访问了 Map 中不存在的键,就会返回 null。因此你获取的 _userFilters['gluten'] 实际类型是 bool?,无法直接作为 if 语句的判断条件(条件要求非空布尔值)。
你使用 as bool 强转只解决了静态语法检查的报错,运行时如果对应键不存在返回 null,就会抛出你遇到的类型转换异常。
解决方案
推荐以下几种安全的处理方式:
方案1:使用空合并运算符设置默认值
用??给可空值设置保底默认值,不存在的键默认返回false,全程不会出现空值,是最稳妥的方案:if (_userFilters['gluten'] ?? false) { return false; }方案2:先判空再使用
先判断值不为空再做逻辑判断,Dart 会自动对判空后的变量做类型提升:final glutenFilter = _userFilters['gluten']; if (glutenFilter != null && glutenFilter) { return false; }方案3:非空断言(仅适合100%确认键存在的场景)
如果你能完全保证访问的键一定存在于_userFilters中,也可以用!强制断言非空,但如果键不存在会直接抛出空断言异常,风险较高:if (_userFilters['gluten']!) { return false; }
修正后参考代码
//this is the code Map<String, bool> _userFilters = { "gluten": false, "lactose": false, "vegan": false, "vegetarian": false, }; List<Meal> filteredMeal = DUMMY_MEALS; void saveFilters(Map<String, bool> filteredData) { setState(() { _userFilters = filteredData; filteredMeal = DUMMY_MEALS.where( (meal) { if (_userFilters['gluten'] ?? false) { return false; } if (_userFilters['lactose'] ?? false) { return false; } if (_userFilters['vegan'] ?? false) { return false; } if (_userFilters['vegetarian'] ?? false) { return false; } return true; }, ).toList(); }); }
内容的提问来源于stack exchange,提问作者Munsif Ali
相关产品推荐
相关产品推荐

