Dart即使通过键相等也无法在地图中找到值

时间:2015-05-11 09:32:43

标签: dart

我有一个复杂对象作为键的地图

Map<TimeseriesNode , MyObject> myMap = {};

TimeseriesNode类已实现hashCode==运算符

class TimeseriesNode {
  String product;
  String model;
  String element;
  String locationName;
  String locationSuffix;

  TimeseriesNode.create(this.product, this.model, this.element, this.locationName, this.locationSuffix);

  int get hashCode {
    return hashObjects([product, model, element, locationName, locationSuffix]);
  }

  bool operator ==(other) {
    if (other is! TimeseriesNode) return false;
    TimeseriesNode key = other;
    return (key.element == element 
        && key.locationName == locationName 
        && key.locationSuffix == locationSuffix 
        && key.model == model 
        && key.product == product);
  }
}

(方法hashObjects来自import&#34; package:quiver / core.dart&#34 ;;)

我的应用程序的一部分创建了密钥并将它们添加到地图中。

应用程序的另一部分创建一个新的TimeseriesNode(等于原始密钥),然后使用此实例查询地图。

MyObject obj = myMap[ node];

奇怪的是地图会返回null。我做了一些调试,发现myMap [node]在dart中调用了以下代码:collection-patch_compact_hash code

  V operator [](Object key) {
    var v = _getValueOrData(key);
    return identical(_data, v) ? null : v;
  }

当我检查v时,我可以看到&#39; v&#39;是最初添加到地图的对象,但代码返回null。

如果我在我的equals方法上设置一个断点,它就永远不会被调用。

发生了什么事?

2 个答案:

答案 0 :(得分:1)

用于计算哈希码的字段应该是不可变的(最终)。我猜你在将元素插入地图后更改其中一个字段。这导致映射没有通过哈希码找到实例,因此没有达到它进行等于检查的状态。

答案 1 :(得分:0)

感谢您的帮助 - 在收到您的反馈意见后,我发现了一个不相关的代码中的问题

像往常一样,飞镖api按预期工作得很漂亮!

Dart是一款很棒的产品!