【问题标题】:How to use object comparision for custom objects in dart/flutter如何在 dart/flutter 中对自定义对象使用对象比较
【发布时间】:2021-05-18 07:37:01
【问题描述】:

我有一些菜。

我想检索在他的菜单中有特定菜肴列表的所有餐厅。

我的数据模型是这样的:

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) =&gt; !temp.contains(element)); 时它返回一个空列表。

我哪里错了?

谢谢

【问题讨论】:

  • 您好。如果可能,请尝试使用https://dartpad.dev/ 制作可重现的演示。您的问题似乎更多是关于操纵列表而不是firebase。因此,请尝试创建基本示例列表并尝试执行您在 dartpad 中尝试的操作。
  • 是的,问题出在操纵字符串以达到 Firebase 限制 :),我使用了 pad 和基本列表,我的代码似乎可以工作,问题在于自定义列表对象。
  • 您在飞镖垫中定义自定义对象并创建示例自定义对象?这对制作演示没有帮助吗?
  • 我也试过这种方式void main() { List l1 = [ { "catId": '1' }, { "catId": '2' }, ]; List l2 = [{ "catId": '2' }, { "catId": '3' }, ]; List l3 = [{ "catId": '2' }, { "catId": '4' }, ]; l1.removeWhere((item) =&gt; !l2.contains(item)); l1.removeWhere((item) =&gt; !l3.contains(item)); print(l1); },但我得到的是空的
  • 是的,它给了[]。现在你能解释一下你期望的输出吗?

标签: list dart comparison custom-object object-comparison


【解决方案1】:

在比较您创建的自定义类的对象时,您必须覆盖 == 覆盖和 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);
}

【讨论】:

  • 酷!我忘记了 == 和哈希码的覆盖方法!非常感谢!
  • @GTF 很高兴有帮助:)。这是一个很好的问题,所以我投了赞成票。人们可能有类似的问题。所以我编辑了问题以添加正确的标签和标题。如果您认为答案足够,请考虑为它点赞,以便让更多人受益。
猜你喜欢
  • 2016-05-17
  • 2018-09-15
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多