为什么需要在flutter_bloc中使用Equatable类? ,还有道具,我们需要什么呢?这是在扑打中形成团块状态的示例代码,请提供详细答案。预先谢谢你
abstract class LoginStates extends Equatable{}
class LoginInitialState extends LoginStates{
@override
List<Object> get props => [];
}
答案 0 :(得分:3)
我们正在使用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可能会对您有所帮助。
答案 1 :(得分:2)
为了比较数据,我们需要 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
答案 2 :(得分:1)
Equatable
为您覆盖==和hashCode
,因此您不必浪费时间编写大量样板代码。
还有其他一些软件包会真正为您生成样板;但是,您仍然必须运行不理想的代码生成步骤。
有了Equatable
,就不需要生成代码,我们可以将更多精力放在编写出色的应用程序上,而将精力放在平凡的任务上。
而props
是getter
中的equatable
,它具有我们想要的属性
尽管不需要关注它,但我只是将属性放在道具吸气剂上
并不是那么重要,但是我建议您在here