为什么我的indexOf在flutter中输出-1?

问题描述 投票:0回答:2

`类任务{字符串名称;bool isDone;

Task({this.name,this.isDone = false});

}

Class TaskData {列出任务= [任务(名称:“购买牛奶”),任务(名称:“购买鸡蛋”),任务(名称:“买面包”)];

}

void main(){

print(TaskData()。tasks.indexOf(Task(name:'Buy milk''))));}`

为什么打印-1?

flutter indexof
2个回答
0
投票
但是,我们可以使用Equatable包将类对象与其他变量进行比较。

在pubspec.yaml文件中添加Equatable程序包,然后如下更改您的类。现在您将获得欲望输出。

class Task extends Equatable { String name; bool isDone; Task({this.name, this.isDone = false}); @override List<Object> get props => [name, isDone]; }


0
投票
different实例,它们也许具有相同的属性,但是它们实际上彼此独立。在这种情况下,两个任务在逻辑上是相等的,但Dart不可能知道。您的选择是:

使用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,按照此设计规则,我列出的第一个解决方案最容易实现。
© www.soinside.com 2019 - 2024. All rights reserved.