将Equatable类与flutter_bloc一起使用

0h4hbjxa  于 2023-03-24  发布在  Flutter
关注(0)|答案(3)|浏览(145)

为什么我们需要在flutter_bloc中使用Equatable类?还有,我们使用props做什么?下面是在Flutter中使用块模式创建状态的示例代码。

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

gmol16391#

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

abstract class LoginStates extends Equatable{}

因此,这意味着LoginStates不会进行重复调用,并且如果发生相同的状态,也不会重新构建小部件。

定义状态:

class LoginInitialState extends LoginStates {}

使用props定义状态:

当我们希望State与props List中声明的值进行比较时,声明props

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
}
tf7tbtn2

tf7tbtn22#

我们使用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 like

class Person extends Equatable

在整批情况下;如果您尝试在可变状态下使用阻塞,那么在没有Equatable情况下您将面临问题。它使资源不可变,从而降低性能。创建副本的成本比更改属性的成本更高。
如果你不清楚我试图解释的内容,阅读这篇文章可以帮助你。

holgip5t

holgip5t3#

Equatable会为您覆盖==和hashCode,因此您不必浪费时间编写大量的样板代码。
还有其他的包可以为您生成样板文件;然而,您仍然必须运行代码生成步骤,这并不理想。
有了Equatable,就不需要生成代码,我们可以把更多的精力放在编写令人惊叹的应用程序上,而不是做一些平凡的工作。
虽然它不需要关注它,我只把属性放给props getter,这并不重要,但我建议你在here中阅读更多关于它的内容

相关问题