在Map中使用类作为键的Flutter/Dart

svgewumm  于 2023-05-18  发布在  Flutter
关注(0)|答案(1)|浏览(173)

我有一个类:

class MyClass {
  MyClass(this.id, this.name);

  final int id;
  final String name;
}

然后将类添加到Map中,并包含一些额外的信息:

Map<MyClass, String> myMap = { 
   MyClass(0, "Hello")  : "First", 
   MyClass(1, "World!") : "Second" 
};

然后我有一些回调函数:

function doMagic(MyClass thisOne) {
  String? value = myMap[thisOne];
}

现在应该可以正常工作了,如果您使用的是相同的Object...但实际上thisOne是从数据库中重新创建的,因此与myMap中的对象不同,因此不匹配。
我能想到的唯一方法就是:

function doMagic(MyClass thisOne) {
  List<MyClass> matchItem = myMap.keys.where((my) => my.id == thisOne.id).toList();
  String? value;

  if(matchItem.isNotEmpty) {
    value = myMap[matchItem[0]];
  }
}

我确信我在某个地方读到过关于检查对象的Map的问题,因为这个问题(它正在寻找相等的示例而不是内容)。有更简单的方法吗?

2wnc66cl

2wnc66cl1#

感谢@Richard Heap…
答案是提供==操作符覆盖和hashCode覆盖,然后允许Map []操作符使用其中之一来进行值相等比较。

class MyClass {
  MyClass(this.id, this.name);

  final int id;
  final String name;

  bool operator==(Object other) =>
      other is MyClass && id == other.id && name == other.name;

  int get hashCode => Object.hash(id, name);
}

现在,这工作正常:

function doMagic(MyClass thisOne) {
  String? value = myMap[thisOne];
}

相关问题