首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在flutter_bloc中使用等价类

在flutter_bloc中使用等价类
EN

Stack Overflow用户
提问于 2020-10-12 11:11:08
回答 3查看 10.3K关注 0票数 18

为什么我们需要在flutter_bloc中使用等价类?还有,我们用这些道具做什么?下面是使用颤振中的整块模式创建状态的示例代码。

代码语言:javascript
复制
    abstract class LoginStates extends Equatable{}
    
    class LoginInitialState extends LoginStates{
      @override
      List<Object> get props => [];
    
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-29 15:32:21

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

代码语言:javascript
复制
 abstract class LoginStates extends Equatable{}

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

定义状态:

代码语言:javascript
复制
class LoginInitialState extends LoginStates {}

用道具定义状态:

当我们希望将props与道具列表中声明的值进行比较时,State声明了

代码语言:javascript
复制
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字段。这就是为什么我们使用道具来处理状态更改。

Bloc流的使用:

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

代码语言:javascript
复制
@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

票数 21
EN

Stack Overflow用户

发布于 2020-10-12 11:37:45

我们使用的是等效包,这样我们就可以比较类的实例,而不必手动覆盖"==“和hashCode。

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

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

代码语言:javascript
复制
class Person {
  final String name;

  const Person(this.name);
}

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

代码语言:javascript
复制
void main() {
  final Person bob = Person("Bob");
}

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

代码语言:javascript
复制
print(bob == Person("Bob")); // false

为了能够比较Person的两个实例,我们需要更改类来重写==和hashCode,如下所示:

代码语言:javascript
复制
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;
}

现在,如果我们再次运行以下代码:

代码语言:javascript
复制
print(bob == Person("Bob")); // true

它将能够比较不同的人的实例。

因此,当重写"==“和hashCode时,不必浪费时间编写大量样板代码。

使用等价类

代码语言:javascript
复制
class Person extends Equatable

在集团的情况下,如果你试图使用可变状态的集团,你将面临的问题,没有平等。它使资源不可变,降低了性能。创建副本比改变属性要昂贵得多。

如果你不清楚我想解释什么,读可以帮你。

票数 11
EN

Stack Overflow用户

发布于 2020-10-12 11:26:01

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

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

有了Equatable,就不需要生成代码了,我们可以更多地专注于编写令人惊叹的应用程序,而不是普通的任务。props是一个getter of equatable,它接受我们想要的属性。

虽然它不需要关注它,但我只提供属性来支持它,它并不重要,但我建议您在这里中阅读更多关于它的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64316700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档