我有一个复杂对象作为键的地图
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方法上设置一个断点,它就永远不会被调用。
发生了什么事?
答案 0 :(得分:1)
用于计算哈希码的字段应该是不可变的(最终)。我猜你在将元素插入地图后更改其中一个字段。这导致映射没有通过哈希码找到实例,因此没有达到它进行等于检查的状态。
答案 1 :(得分:0)
感谢您的帮助 - 在收到您的反馈意见后,我发现了一个不相关的代码中的问题
像往常一样,飞镖api按预期工作得很漂亮!
Dart是一款很棒的产品!