在很多的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

标签: Flutter, Equatable, Equatable是什么, Equatable怎么使用

添加新评论