在flutter_bloc中使用Equatable类

问题描述

为什么需要在Flutter_bloc中使用Equatable类? ,还有道具,我们需要什么呢?这是在扑打中形成团块状态的示例代码,请提供详细答案。预先谢谢你

abstract class LoginStates extends Equatable{}

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

}

解决方法

我们正在使用Equatable包,以便我们可以比较类的实例,而不必手动覆盖“ ==”和hashCode。

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

这是一个公平的例子。假设我们有以下课程:

class Person {
  final String name;

  const Person(this.name);
}

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

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

稍后,如果我们尝试在生产代码或测试中比较Person的两个实例,则会遇到问题。

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

为了能够比较Person的两个实例,我们需要更改我们的类以覆盖==和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的情况下您将面临问题。它使资源不可变,从而降低性能。创建副本比对属性进行更改要昂贵得多。

如果您不确定我是否要解释,请阅读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 变化的原因。

块流使用:

当我们扩展 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

,

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

还有其他一些软件包会真正为您生成样板;但是,您仍然必须运行不理想的代码生成步骤。

有了Equatable,就不需要生成代码,我们可以将更多精力放在编写出色的应用程序上,而将精力放在平凡的任务上。 而propsgetter中的equatable,它具有我们想要的属性
尽管不需要关注它,但我只是将属性放在道具吸气剂上 并不是那么重要,但是我建议您在here

中阅读更多有关它的内容。