【问题标题】:Dart/Flutter : How to compare if 2 objects are equivalent without using EquatableDart/Flutter:如何在不使用 Equatable 的情况下比较 2 个对象是否相等
【发布时间】:2021-10-14 23:56:35
【问题描述】:

我想测试 2 个对象、同一类的 2 个不同实例是否具有所有相同的属性值;
(即,看看它们在逻辑上是否等价)。

我不想只检查它们是否是完全相同的对象(例如 this)。

而且我不想使用Equatable package,只是因为我不想将我的属性标记为final

我想要的本质上是对 2 个对象的所有属性进行简单的深度比较。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我认为您需要重写类中的两个方法来执行自定义比较。

    1. == 运算符
    2. hashCode 吸气剂

    例如:

    class MyObj {
      String name;
      
      MyObj(this.name);
      
      @override
      bool operator ==(Object o) {
        if (o is MyObj && o.runtimeType == runtimeType) {
          if (o.name == name) {
            return true;
          }
        }
        return false;
      }
      
      @override
      int get hashCode => name.hashCode;
    }
    

    对此进行测试:

    void main() {
      MyObj objA = MyObj('billy');
      MyObj objB = MyObj('bob');
      MyObj objC = MyObj('billy');
      
      print('object A == object B? ${objA == objB}');
      print('object A == object C? ${objA == objC}');
     
    }
    
    

    应该产生:

    object A == object B? false
    object A == object C? true
    

    要为多个属性覆盖 hashCode,也许可以查看 this discussion

    【讨论】:

    • 我希望有一种更简单的方法 - 但搜索没有找到。这当然有效。我会补充一点,对于任何MapList 属性,都可以使用DeepCollectionEquality().equals(o, this)(需要import 'package:collection/collection.dart';)。
    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 2016-08-17
    • 2013-04-15
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多