如何使用 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] 因此我只想检索 rest1rest2

我的代码是这样的:

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);
}