Flutter Equatable的作用

翻翻项目代码,发现有相当多的地方页使用了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都会进行页面刷新,这样会浪费不必要的性能。

参考资料:https://pub.flutter-io.cn/packages/equatable

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。