筛选器不符合预期?如何实现Vegan/Lactose至少满足其一的餐食筛选
问题解答
问题1:为何筛选器的运行不符合预期?
当前代码的逻辑是只要开启任意一个筛选条件,餐食必须满足该条件;开启多个条件时,餐食必须同时满足所有开启的条件。如果你的预期是“满足任意一个开启的条件即可”,现有逻辑就会和预期不符——比如开了Vegan和Lactose,只会显示同时符合两者的餐食,而非符合其中一项的。
此外,也可能是以下细节导致不符合预期:
_filters的键名和餐食对象的属性名是否完全匹配?比如代码里lactose对应meal.isLactoseFree,需确保无拼写错误- SwitchTile的状态绑定是否正确?确认切换开关时
_filters的布尔值确实在同步更新 - DUMMY_MEALS里的餐食数据是否正确设置了对应的
isXXXFree属性?比如有的餐食可能标记错了isVegan
问题2:如何修改逻辑以显示满足其中一项或两项的餐食?
要实现“满足任意一个开启的筛选条件即可”,需先收集所有开启的筛选条件,再判断餐食是否至少符合其中一个;若没有开启任何条件,则返回所有餐食。
修改后的代码如下:
Map<String, bool> _filters = { 'gluten': false, 'lactose': false, 'vegan': false, 'vegetarian': false, }; // 筛选逻辑修改 _availableMeals = DUMMY_MEALS.where((meal) { // 收集所有开启的筛选条件键名 final activeFilters = _filters.entries .where((entry) => entry.value) .map((entry) => entry.key) .toList(); // 如果没有开启任何筛选,直接返回所有餐食 if (activeFilters.isEmpty) { return true; } // 判断餐食是否满足至少一个开启的条件 return activeFilters.any((filter) { switch (filter) { case 'gluten': return meal.isGlutenFree; case 'lactose': return meal.isLactoseFree; case 'vegan': return meal.isVegan; case 'vegetarian': return meal.isVegetarian; default: return false; } }); }).toList();
逻辑说明:
- 先提取所有被开启的筛选条件(
activeFilters) - 若无开启的条件,直接返回全部餐食
- 使用
any方法判断:只要餐食符合activeFilters中的任意一项,就保留该餐食
这样当你同时开启Vegan和Lactose时,所有符合Vegan或者Lactose-Free的餐食都会被显示出来。
内容的提问来源于stack exchange,提问作者tantan
相关产品推荐
相关产品推荐

