使用 Equatable class 和 flutter_bloc

using Equatable class with flutter_bloc

为什么我们需要将 Equatable class 与 flutter_bloc 一起使用? ,还有道具,我们需要什么?这是在 flutter 中以 bloc 模式创建状态的示例代码,我需要一个详细的答案。提前谢谢你

abstract class LoginStates extends Equatable{}

class LoginInitialState extends LoginStates{
  @override
  List<Object> get props => [];

}

Equatable 为您覆盖 == 和 hashCode,因此您不必浪费时间编写大量样板代码。

还有其他包可以实际为您生成样板文件;但是,您仍然需要 运行 代码生成步骤,这并不理想。

使用 Equatable 不需要代码生成,我们可以更多地专注于编写出色的应用程序,而不是处理平凡的任务。 propsequatablegetter,它具有我们想要的属性
虽然它不需要关注它我只把属性放在道具 getter 这不是那么重要,但我建议您在 here

中阅读更多相关信息

我们正在使用 Equatable 包,这样我们就可以比较 classes 的实例,而无需手动覆盖“==”和 hashCode。

Equatable class 允许我们比较两个对象是否相等。

这是等式的例子。假设我们有以下 class:

class Person {
  final String name;

  const Person(this.name);
}

我们可以像这样创建 Person 的实例:

void main() {
  final Person bob = Person("Bob");
}

稍后,如果我们尝试在生产代码或测试中比较 Person 的两个实例,我们将 运行 变成一个问题。

print(bob == Person("Bob")); // false

为了能够比较 Person 的两个实例,我们需要更改 class 以覆盖 == 和 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
class Person extends Equatable

在集团案例中;如果你尝试使用具有可变状态的 bloc,你将面临没有 Equatable 的问题。它使资源不可变会降低性能。创建副本比改变 属性.

更昂贵

如果您不清楚我试图解释的内容,阅读 this 可能会对您有所帮助。

为了比较数据,我们需要Equatable。它在内部覆盖了 ==hashCode,从而节省了大量样板代码。在 Bloc 中,我们必须将 Equatable 扩展到 States and Events 类 才能使用此功能。

 abstract class LoginStates extends Equatable{}

所以,这意味着 LoginStates 不会进行重复调用,如果发生相同的状态,也不会重建小部件。

定义状态:

class LoginInitialState extends LoginStates {}

用道具定义状态:

props 当我们希望将 State 与在 props List

中声明的值进行比较时声明
class LoginData extends LoginStates {
  final bool status;
  final String userName;
  const LoginData({this.status, this.userName});
  @override
  List<Object> get props => [this.status, this.userName];
}

如果我们从列表中删除用户名并保留像 [this.status] 这样的列表,那么 State 将只考虑 status 字段,避免 username 字段。这就是我们使用 props 来处理状态变化的原因。

块流用法:

当我们扩展 State with Equatable 时,将旧状态数据与新状态数据进行比较。作为一个例子,让我们看下面的例子,这里 LoginData 将只构建一个小部件一次,这将避免第二次调用,因为它是重复的。

@override
Stream<LoginStates> mapEventToState(MyEvent event) async* {
  yield LoginData(true, 'Hello User');
  yield LoginData(true, 'Hello User'); // This will be avoided
}

详细博客:https://medium.com/flutterworld/flutter-equatable-its-use-inside-bloc-7d14f3b5479b