Flutter/Dart用Map值做if条件报可空表达式错误如何解决
报错原因
Dart 空安全机制下,Map 通过键取值的 [] 运算符返回可空类型,即使你确定指定键一定存在对应值,编译器也无法通过静态检查。你代码中 _filters['gluten'] 这类表达式的类型是 bool?,不能直接作为 if 的判断条件(条件要求是非空的 bool 类型)。
另外你现有代码存在两个逻辑问题:
- 第二个筛选条件的键名拼写错误,还多了冗余字符,
_filters['lactode']e应改为_filters['lactose'] where回调缺少匹配成功的返回逻辑,所有筛选条件都不触发时需要返回true才会保留对应餐品
解决方案
下面两种方案按需选择即可:
方案1:强转为非空(确定
_filters一定包含对应键的场景)
直接在取值表达式后加!告诉编译器该值不会为空,修改后代码如下:List<Meal> _availabaleMeals = DUMMY_MEALS; void _setFilters(Map<String, bool> filterData){ setState(() { _filters = filterData; _availabaleMeals = DUMMY_MEALS.where((meal){ if (_filters['gluten']! && !meal.isGlutenFree) { return false; } if (_filters['lactose']! && !meal.isLactoseFree) { return false; } if (_filters['vegan']! && !meal.isVegan) { return false; } if (_filters['vegetarian']! && !meal.isVegetarian) { return false; } return true; }).toList(); }); }方案2:设置默认兜底值(更稳妥,避免键不存在的异常)
用??为可空值指定为空时的默认值,比如为空时默认按false处理,无需强转:// 仅示例修改后的单条判断,其余判断逻辑同理修改即可 if ((_filters['gluten'] ?? false) && !meal.isGlutenFree) { return false; }
内容的提问来源于stack exchange,提问作者Mohamed_kadi
相关产品推荐
相关产品推荐

