10

为什么当我们需要使用 Flutter_bloc 的 Equatable 类时?,还有道具呢,我们需要什么?这是在颤动中以 bloc 模式创建状态的示例代码,我需要一个详细的答案。先感谢您

abstract class LoginStates extends Equatable{}

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

}
4

3 回答 3

10

为了比较数据,我们需要Equatable. 它在内部覆盖==hashCode,这节省了很多样板代码。在Bloc中,我们必须扩展EquatableStates 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

于 2021-05-29T15:32:21.363 回答
8

我们正在使用 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 之类的

class Person extends Equatable

在整体情况下;如果您尝试使用具有可变状态的 bloc,您将面临没有 Equatable 的问题。它使资源不可变降低了性能。创建副本比改变属性更昂贵。

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

于 2020-10-12T11:37:45.990 回答
1

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

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

由于Equatable不需要生成代码,我们可以更多地专注于编写令人惊叹的应用程序,而不是平凡的任务。并且props是其中的一个getter, 尽管它不需要关注它,但它需要我们equatable想要的属性

于 2020-10-12T11:26:01.113 回答