class Person {
final String name;
const Person(this.name);
}
我们可以像这样创建Person的示例:
void main() {
final Person bob = Person("Bob");
}
稍后,如果我们尝试在生产代码或测试中比较Person的两个示例,我们将遇到问题。
print(bob == Person("Bob")); // false
为了能够比较Person的两个示例,我们需要修改我们的类来覆盖==和hashCode,如下所示:
class Person {
final String name;
const Person(this.name);
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Person &&
runtimeType == other.runtimeType &&
name == other.name;
@override
int get hashCode => name.hashCode;
}
现在,如果我们再次运行以下代码:
print(bob == Person("Bob")); // true
它将能够比较Person的不同示例。 因此,当重写“==”和hashCode时,您不必浪费时间编写大量样板代码。 使用Equatable like
3条答案
按热度按时间gmol16391#
为了比较数据,我们需要
Equatable
。它在内部覆盖==
和hashCode
,这节省了大量样板代码。在Bloc
中,我们必须将Equatable
扩展到States and Events
类才能使用此功能。因此,这意味着
LoginStates
不会进行重复调用,并且如果发生相同的状态,也不会重新构建小部件。定义状态:
使用props定义状态:
当我们希望
State
与props List中声明的值进行比较时,声明props
如果我们从列表中删除用户名,并保留一个类似
[this.status]
的列表,那么State
将只考虑status
字段,避免username
字段。这就是为什么我们使用props来处理状态更改。分块流使用情况:
当我们扩展
State with Equatable
时,它会比较旧的状态数据和新的状态数据。作为一个例子,让我们看看下面的例子,LoginData将只构建一次小部件,这将避免第二次调用,因为它是重复的。tf7tbtn22#
我们使用Equatable包,这样我们就可以比较类的示例,而不必手动重写“==”和hashCode。
Equatable类允许我们比较两个对象是否相等。
这是一个等价的例子。假设我们有下面的类:
我们可以像这样创建Person的示例:
稍后,如果我们尝试在生产代码或测试中比较Person的两个示例,我们将遇到问题。
为了能够比较Person的两个示例,我们需要修改我们的类来覆盖==和hashCode,如下所示:
现在,如果我们再次运行以下代码:
它将能够比较Person的不同示例。
因此,当重写“==”和hashCode时,您不必浪费时间编写大量样板代码。
使用Equatable like
在整批情况下;如果您尝试在可变状态下使用阻塞,那么在没有Equatable情况下您将面临问题。它使资源不可变,从而降低性能。创建副本的成本比更改属性的成本更高。
如果你不清楚我试图解释的内容,阅读这篇文章可以帮助你。
holgip5t3#
Equatable
会为您覆盖==和hashCode
,因此您不必浪费时间编写大量的样板代码。还有其他的包可以为您生成样板文件;然而,您仍然必须运行代码生成步骤,这并不理想。
有了
Equatable
,就不需要生成代码,我们可以把更多的精力放在编写令人惊叹的应用程序上,而不是做一些平凡的工作。虽然它不需要关注它,我只把属性放给props getter,这并不重要,但我建议你在here中阅读更多关于它的内容