为什么当我们需要使用 Flutter_bloc 的 Equatable 类时?,还有道具呢,我们需要什么?这是在颤动中以 bloc 模式创建状态的示例代码,我需要一个详细的答案。先感谢您
abstract class LoginStates extends Equatable{}
class LoginInitialState extends LoginStates{
@override
List<Object> get props => [];
}
为什么当我们需要使用 Flutter_bloc 的 Equatable 类时?,还有道具呢,我们需要什么?这是在颤动中以 bloc 模式创建状态的示例代码,我需要一个详细的答案。先感谢您
abstract class LoginStates extends Equatable{}
class LoginInitialState extends LoginStates{
@override
List<Object> get props => [];
}
为了比较数据,我们需要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 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 类允许我们比较两个对象是否相等。
这是一个平等的例子。假设我们有以下类:
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 的问题。它使资源不可变降低了性能。创建副本比改变属性更昂贵。
如果您不清楚我试图解释的内容,阅读本文可能会对您有所帮助。
Equatable
覆盖 == 并hashCode
为您服务,因此您不必浪费时间编写大量样板代码。
还有其他包实际上会为您生成样板文件;但是,您仍然需要运行不理想的代码生成步骤。
由于Equatable
不需要生成代码,我们可以更多地专注于编写令人惊叹的应用程序,而不是平凡的任务。并且props
是其中的一个getter
,
尽管它不需要关注它,但它需要我们equatable
想要的属性