如何使用 object 比较 dart/flutter 中的自定义 object
How to use object comparision for custom objects in dart/flutter
我有一collection道菜。
我想检索菜单中有特定菜品列表的所有餐厅。
我的数据模型是这样的:
restaurant---->rest1
| |-->menu
| | --> 1: true
| | --> 2: true
| | --> 3: true
|--->rest2
| |-->menu
| | --> 1: true
| | --> 2: true
| | --> 3: true
|--->rest3
| |-->menu
| | --> 1: true
我的菜品清单是 [1,2] 因此我只想检索 rest1
和 rest2
我的代码是这样的:
Future loadRestaurantsByDishes({List idPiatti})async{
idPiatti.forEach((element) async {
dynamic result2 = await _restaurantServices.getRestaurantOfDish(id_piatto: element["dishId"].toString());
rest.add( result2);
});
if(rest.length >0){
List<RestaurantModel> mom = [];
List<RestaurantModel> temp = [];
rest.forEach((item) {
if(mom.isEmpty){
mom.addAll(item);
}else{
temp.addAll(item);
mom.removeWhere((element) => !temp.contains(element));
temp = [];
}
});
notifyListeners();
}
}
Future<List<RestaurantModel>> getRestaurantOfDish({String id_piatto}) async =>
_firestore.collection(collection).where("menu."+id_piatto, isEqualTo: true).get().then((result) {
List<RestaurantModel> restaurants = [];
for (DocumentSnapshot restaurant in result.docs) {
restaurants.add(RestaurantModel.fromSnapshot(restaurant));
}
return restaurants;
});
我的想法是检索所有制作特定菜肴的餐厅,然后检索这些列表之间的共同元素,以便检索唯一一家拥有所有这些元素的餐厅。
问题是第一个语句中的mom
等于item,但是当我运行mom.removeWhere((element) => !temp.contains(element));
它returns一个空列表。
我哪里错了?
谢谢
比较您创建的自定义 类 对象时,您必须覆盖 ==
覆盖和 hashCode
函数。
您可以使用下面解释的方法来自定义 类,以便使用 ==
运算符比较其中的两个。
在 DartPad.
中尝试 运行
class Cat {
String id;
Cat(this.id);
@override
bool operator == (Object other){
return other is Cat && id == other.id;
}
@override
int get hashCode => id.hashCode;
@override
String toString() => '{ id: $id }';
}
void main() {
List l1 = [Cat('1'), Cat('2')];
List l2 = [Cat('2'), Cat('3')];
List l3 = [Cat('2'), Cat('4')];
l1.removeWhere((item) => !l2.contains(item));
l1.removeWhere((item) => !l3.contains(item));
print(l1);
}
我有一collection道菜。
我想检索菜单中有特定菜品列表的所有餐厅。
我的数据模型是这样的:
restaurant---->rest1
| |-->menu
| | --> 1: true
| | --> 2: true
| | --> 3: true
|--->rest2
| |-->menu
| | --> 1: true
| | --> 2: true
| | --> 3: true
|--->rest3
| |-->menu
| | --> 1: true
我的菜品清单是 [1,2] 因此我只想检索 rest1
和 rest2
我的代码是这样的:
Future loadRestaurantsByDishes({List idPiatti})async{
idPiatti.forEach((element) async {
dynamic result2 = await _restaurantServices.getRestaurantOfDish(id_piatto: element["dishId"].toString());
rest.add( result2);
});
if(rest.length >0){
List<RestaurantModel> mom = [];
List<RestaurantModel> temp = [];
rest.forEach((item) {
if(mom.isEmpty){
mom.addAll(item);
}else{
temp.addAll(item);
mom.removeWhere((element) => !temp.contains(element));
temp = [];
}
});
notifyListeners();
}
}
Future<List<RestaurantModel>> getRestaurantOfDish({String id_piatto}) async =>
_firestore.collection(collection).where("menu."+id_piatto, isEqualTo: true).get().then((result) {
List<RestaurantModel> restaurants = [];
for (DocumentSnapshot restaurant in result.docs) {
restaurants.add(RestaurantModel.fromSnapshot(restaurant));
}
return restaurants;
});
我的想法是检索所有制作特定菜肴的餐厅,然后检索这些列表之间的共同元素,以便检索唯一一家拥有所有这些元素的餐厅。
问题是第一个语句中的mom
等于item,但是当我运行mom.removeWhere((element) => !temp.contains(element));
它returns一个空列表。
我哪里错了?
谢谢
比较您创建的自定义 类 对象时,您必须覆盖 ==
覆盖和 hashCode
函数。
您可以使用下面解释的方法来自定义 类,以便使用 ==
运算符比较其中的两个。
在 DartPad.
中尝试 运行class Cat {
String id;
Cat(this.id);
@override
bool operator == (Object other){
return other is Cat && id == other.id;
}
@override
int get hashCode => id.hashCode;
@override
String toString() => '{ id: $id }';
}
void main() {
List l1 = [Cat('1'), Cat('2')];
List l2 = [Cat('2'), Cat('3')];
List l3 = [Cat('2'), Cat('4')];
l1.removeWhere((item) => !l2.contains(item));
l1.removeWhere((item) => !l3.contains(item));
print(l1);
}