使用 Equatable class 和 flutter_bloc
using Equatable class with flutter_bloc
为什么我们需要将 Equatable class 与 flutter_bloc 一起使用? ,还有道具,我们需要什么?这是在 flutter 中以 bloc 模式创建状态的示例代码,我需要一个详细的答案。提前谢谢你
abstract class LoginStates extends Equatable{}
class LoginInitialState extends LoginStates{
@override
List<Object> get props => [];
}
Equatable
为您覆盖 == 和 hashCode
,因此您不必浪费时间编写大量样板代码。
还有其他包可以实际为您生成样板文件;但是,您仍然需要 运行 代码生成步骤,这并不理想。
使用 Equatable
不需要代码生成,我们可以更多地专注于编写出色的应用程序,而不是处理平凡的任务。
props
是 equatable
的 getter
,它具有我们想要的属性
虽然它不需要关注它我只把属性放在道具 getter
这不是那么重要,但我建议您在 here
中阅读更多相关信息
我们正在使用 Equatable 包,这样我们就可以比较 classes 的实例,而无需手动覆盖“==”和 hashCode。
Equatable class 允许我们比较两个对象是否相等。
这是等式的例子。假设我们有以下 class:
class Person {
final String name;
const Person(this.name);
}
我们可以像这样创建 Person 的实例:
void main() {
final Person bob = Person("Bob");
}
稍后,如果我们尝试在生产代码或测试中比较 Person 的两个实例,我们将 运行 变成一个问题。
print(bob == Person("Bob")); // false
为了能够比较 Person 的两个实例,我们需要更改 class 以覆盖 == 和 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 的问题。它使资源不可变会降低性能。创建副本比改变 属性.
更昂贵
如果您不清楚我试图解释的内容,阅读 this 可能会对您有所帮助。
为了比较数据,我们需要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 class 与 flutter_bloc 一起使用? ,还有道具,我们需要什么?这是在 flutter 中以 bloc 模式创建状态的示例代码,我需要一个详细的答案。提前谢谢你
abstract class LoginStates extends Equatable{}
class LoginInitialState extends LoginStates{
@override
List<Object> get props => [];
}
Equatable
为您覆盖 == 和 hashCode
,因此您不必浪费时间编写大量样板代码。
还有其他包可以实际为您生成样板文件;但是,您仍然需要 运行 代码生成步骤,这并不理想。
使用 Equatable
不需要代码生成,我们可以更多地专注于编写出色的应用程序,而不是处理平凡的任务。
props
是 equatable
的 getter
,它具有我们想要的属性
虽然它不需要关注它我只把属性放在道具 getter
这不是那么重要,但我建议您在 here
我们正在使用 Equatable 包,这样我们就可以比较 classes 的实例,而无需手动覆盖“==”和 hashCode。
Equatable class 允许我们比较两个对象是否相等。
这是等式的例子。假设我们有以下 class:
class Person {
final String name;
const Person(this.name);
}
我们可以像这样创建 Person 的实例:
void main() {
final Person bob = Person("Bob");
}
稍后,如果我们尝试在生产代码或测试中比较 Person 的两个实例,我们将 运行 变成一个问题。
print(bob == Person("Bob")); // false
为了能够比较 Person 的两个实例,我们需要更改 class 以覆盖 == 和 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 时,您不必浪费时间编写大量样板代码。
像
一样使用Equatableclass Person extends Equatable
在集团案例中;如果你尝试使用具有可变状态的 bloc,你将面临没有 Equatable 的问题。它使资源不可变会降低性能。创建副本比改变 属性.
更昂贵如果您不清楚我试图解释的内容,阅读 this 可能会对您有所帮助。
为了比较数据,我们需要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