Flutter/Dart中如何正确重写类使其可作为唯一键存入Map
问题根源
你创建Map时使用了Map.identity()构造方法,该构造方法生成的是基于对象身份(内存地址)判断相等的Map:
- 仅当两个键是完全同一个内存实例时才会被判定为相等,会完全忽略你重写的
==运算符和hashCode - 你每次调用
putIfAbsent时都新建了一个ActivityProject实例,就算属性完全相同、hashCode一致,在Map.identity的判定逻辑里也属于不同的键,因此会全部插入到Map中。
解决方法
替换Map的初始化方式,不用Map.identity,改用默认的Map构造方法即可:
// 替换原有的Map.identity() Map<ActivityProject, int> timesheet = {}; // 也可以显式调用默认构造,效果一致 // Map<ActivityProject, int> timesheet = Map();
默认构造的Map会优先使用你重写的==和hashCode判断键是否相等,属性相同的ActivityProject实例会被判定为同一个键,不会重复插入。修改后运行仅会保留第一个插入的键值对,输出如下:
Hashcode: 176486800 Key: activity-project, Value: 1
补充说明
仅当你需要区分内存地址不同但属性相同的对象时,才需要使用Map.identity,其余需要按自定义相等逻辑判断键的场景,统一使用默认构造的Map即可。
内容的提问来源于stack exchange,提问作者Solovastru Ioan
相关产品推荐
相关产品推荐

