You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:06:01