我是一名新的顫振開發人員,想在我的串列中使用多個過濾器。我正在使用 ListView :
ListView.builder(
itemBuilder: (ctx, index) =>
MealCard(_customList[index]),
itemCount: _customList.length,
),
我的 Meal 課程具有以下屬性:
Meal {
final String id,
final String title,
final String imgUrl,
final bool isLowCalorie,
final bool isVegan,
final bool isBreakfat,
final bool isDinner,
final bool isLunch}
我想根據班級中包含的布林值應用不同的過濾器;我有一些看起來像這樣的方法:
List<Meal> get breakfastFilter {
return _meals.where((element) => element.isBreakfast).toList();
}
List<Meal> get lunchFilter {
return _meals.where((element) => element.isLunch).toList();
}
List<Meal> get dinnerFilter {
return _meals.where((element) => element.isDinner).toList();
但是,這些方法允許我創建一個串列,如果我希望一起添加其他過濾器并創建兩個串列的組合,該怎么辦。
uj5u.com熱心網友回復:
我知道我比賽遲到了,所以讓我把我的名字扔在帽子里。我會對其進行一些重構以支持多個過濾器,否則您不會預先知道將應用多少個過濾器。
我會創建一個名為MealType的列舉:
enum MealType {
none,
isLowCalorie,
isVegan,
isBreakfast,
isDinner,
isLunch
}
重構該類以獲取MealType值的串列:
class Meal {
final String? id;
final String? title;
final String? imgUrl;
final List<MealType>? mealTypeFilter;
Meal({ this.id, this.title, this.imgUrl, this.mealTypeFilter });
}
資料如下所示:
List<Meal> meals = [
Meal(
id: '1001',
title: 'Pancakes',
imgUrl: '',
mealTypeFilter: [
MealType.isBreakfast
]
),
Meal(
id: '1002',
title: 'Chicken Wings',
imgUrl: '',
mealTypeFilter: [
MealType.isLunch
]
),
Meal(
id: '1003',
title: 'Yogurt',
imgUrl: '',
mealTypeFilter: [
MealType.isLowCalorie,
MealType.isBreakfast,
MealType.isVegan
]
)
];
我會在Set中收集應用的過濾器以避免重復,并過濾餐食,無論mealTypeFilter集合是否包含任何應用的過濾器:
Set<MealType> appliedFilters = {};
List<Meal> filteredList = [];
List<Meal> getFilteredList() {
if (appliedFilters.isEmpty) {
return meals;
}
return meals.where((m) => m.mealTypeFilter!.any((f) => appliedFilters.contains(f))).toList();
}
當我觸發一個包含要應用的過濾器的按鈕并填充過濾串列時,我會在 build 方法中呼叫getFilteredList()方法,并使用它渲染ListView的結果:
@override
Widget build(BuildContext context) {
filteredList = getFilteredList();
// rest of the code here
}
請參閱
希望這有效。
uj5u.com熱心網友回復:
你可以這樣做:
bool filterItem(element){
return element.isVegan&&element.isBreakfat;
}
_meals.where((element) => filterItem(element)).toList();
uj5u.com熱心網友回復:
有很多方法可以做到這一點,但您可以嘗試將布林值與可選引數結合使用,如下所示:
getMealFilter(_meals,
{bool lookForBreakfast = false,
bool lookForVegan = false,
bool lookForLunch = false}) {
return _meals
.where((element) =>
(lookForBreakfast && element.isBreakfast) ||
(lookForVegan && element.isBreakfast) ||
(lookForLunch && element.isLunch))
.toList();
}
我只放了 3 個過濾器,但您可以輕松添加其余的。這是如何作業的,例如,如果lookForBreakfast為假,element.isBreakfast則被忽略。(假并且某些東西總是假的),等等其他引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/436541.html
