翻翻项目代码,发现有相当多的地方页使用了Equatable,那么Equatable的作用是什么呢。
首先看下关于官方给出的定义
Equatable可以为你覆写==和hashCode,因此您不必浪费时间编写大量样板代码。
我们知道,比较一个对象需要重写这个对象的==和hashCode方法,而这些代码是固定重复的,Equatable的作用就是简化这个过程。
来看下官方给出的例子
class Person {
const Person(this.name);
final String name;
}
void main() {
final Person bob = Person("Bob");
print(bob == Person("Bob")); // false
}
上面比较了两个对象,对象的值是相同的,但是返回的是false。这是由于==默认比较的是地址,如需要比较内容需要重写==和hashCode方法。
不用Equatable
class Person {
const Person(this.name);
final String 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
使用Equatable
import 'package:equatable/equatable.dart';
class Person extends Equatable {
const Person(this.name);
final String name;
@override
List<Object> get props => [name];
}
print(bob == Person("Bob")); // true
可以看到,使用Equatable只需要返回一个数组,数组的内容就是要比较的值,相对于覆写==和hashCode省略了大量的模板代码。
注意: Equatable 被设计为仅适用于不可变对象,因此所有成员变量都必须是最终的(这不仅仅是一个特性Equatable-用可变值覆盖 hashCode会破坏基于哈希的集合)。也就是说Equatable里的变量都必须是final的。
说了这么多,Equatable哪些地方用的最多呢。
在本人项目中,使用最多的地方是在Bloc中。举个例子,Bloc的state会继承Equatable,若有个事件响应了一个state,可以通过Equatable判断state的值是否发生改变从而控制页面是否进行更新,否则每次响应state都会进行页面刷新,这样会浪费不必要的性能。