[Flutter]Equatable是什么?它有什么作用?
在很多的Flutter项目中会发现很多地方都使用了Equatable。
Equatable的中文意思是“相等”的意思
Equatable官方给出的定义是:可以为我们覆写==和hashCode,以减少代码工作量。
通常,我们要比较一个对象需要重写该对象的==和hashCode方法,然而这些代码都是固定重复的。所以,这个时候Equatable的出现就简化了我们编码工作。
下面以官方Demo来说明:
class Person {
const Person(this.name);
final String name;
}
void main() {
final Person bob = Person("Bob");
print(bob == Person("Bob")); // false
}
上面比较了两个对象,对象的值是相同的,但是返回的结果却是false。这个是因为==对比的是对象地址,如果需要比较对象的内容就需要重写==和hashCode的方法。
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
上面就是比较对象的内容方法,我们重写了==和hashCode的方法,对比的结果也是我们期望的结果。
显然,这样的处理方式会增加我们的编码量,也会使我们做很多的重复工作。
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省略了大量的代码编写工作。
Tip:
在使用Equatable的时候需要注意,Equatable 被设计为仅适用于不可变对象,因此所有成员变量都必须是最终的(这不仅仅是一个特性Equatable- 用可变值覆盖 hashCode会破坏基于哈希的集合 )。也就是说Equatable里的变量都必须是final的。
那么,Equatable 到底都用在哪些地方呢?
在项目中Equatable使用最多的地方是在Bloc中。Bloc的state会继承Equatable,如果有一个事件响应了一个state,则可以通过Equatable判断state的值是否发生了改变,从而控制界面是否进行更新。否则每次响应state都会进行界面更新,这样会大大降低性能。
Equatable官方参考资料:https://pub.flutter-io.cn/packages/equatable