`类任务{字符串名称;bool isDone;
Task({this.name,this.isDone = false});
}
Class TaskData {列出任务= [任务(名称:“购买牛奶”),任务(名称:“购买鸡蛋”),任务(名称:“买面包”)];
}
void main(){
print(TaskData()。tasks.indexOf(Task(name:'Buy milk''))));}`
为什么打印-1?
使用const构造函数
Dart中的const构造函数使您可以创建作为编译时常量的实例。如果使用这样的构造函数,Dart将确定在创建Task
之后其属性将永远不会改变。因此,假设Task(name: 'Buy milk')
无论如何都将始终具有与另一个Task(name: 'Buy milk')
相同的属性(它们是相等的),这将很容易。要实现此目的,您必须按以下步骤更改代码:class Task {
final String name;
final bool isDone;
const Task({this.name, this.isDone = false});
}
覆盖hashCode和==运算符
如果您不希望Task是不可变的,则应覆盖Task
当前的原始相等性检查。来自Dart的文档:默认的哈希码实现提供了一个身份哈希-两个对象通常只有相同的哈希码(如果确切)同一对象。同样,==的默认行为是身份。
如果您要覆盖==,则表示您可能有其他对象在您的班级中被认为是“平等”的。任何两个对象equal必须具有相同的哈希码。否则,地图等基于散列的集合将无法识别这两个对象是等效。
默认hashCode表示实例的身份,但是在这种情况下,我们希望它表示其属性。请注意,对于具有不同属性的实例,hashCode最终不应相同。只要保留了此原则,通常不重要如何实现它。我将使用提供的示例here给出可能的实现:
@override int get hashCode { int result = 17; result = 37 * result + name.hashCode; result = 37 * result + isDone.hashCode; return result; }
现在覆盖
==
运算符以反映更改:
@override
bool operator ==(dynamic other) {
if (other is! Task) return false;
Task task = other;
return (task.name == name &&
task.isDone == isDone);
}
}
请注意,Dart通常建议使用avoid defining custom equality for mutable classes,按照此设计规则,我列出的第一个解决方案最容易实现。