为什么我们需要在flutter_bloc中使用等价类?还有,我们用这些道具做什么?下面是使用颤振中的整块模式创建状态的示例代码。
abstract class LoginStates extends Equatable{}
class LoginInitialState extends LoginStates{
@override
List<Object> get props => [];
}发布于 2021-05-29 15:32:21
为了比较数据,我们需要Equatable。它在内部覆盖==和hashCode,这节省了大量样板代码。在Bloc中,为了使用此功能,我们必须将Equatable扩展到States and Events类。
abstract class LoginStates extends Equatable{}因此,这意味着如果发生相同的状态,LoginStates将不会进行重复调用,也不会重新构建小部件。
定义状态:
class LoginInitialState extends LoginStates {}用道具定义状态:
当我们希望将props与道具列表中声明的值进行比较时,State声明了
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将只构建一个小部件一次,这将避免重复第二个调用。
@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
发布于 2020-10-12 11:37:45
我们使用的是等效包,这样我们就可以比较类的实例,而不必手动覆盖"==“和hashCode。
Equatable类允许我们比较两个对象是否相等。
这是一个等价的例子。假设我们有以下课程:
class Person {
final String name;
const Person(this.name);
}我们可以创建这样的人的实例:
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它将能够比较不同的人的实例。
因此,当重写"==“和hashCode时,不必浪费时间编写大量样板代码。
使用等价类
class Person extends Equatable在集团的情况下,如果你试图使用可变状态的集团,你将面临的问题,没有平等。它使资源不可变,降低了性能。创建副本比改变属性要昂贵得多。
如果你不清楚我想解释什么,读这可以帮你。
发布于 2020-10-12 11:26:01
Equatable为您重写了==和hashCode,因此您不必浪费时间编写大量样板代码。
还有其他包实际上会为您生成样板;但是,您仍然需要运行代码生成步骤,这并不理想。
有了Equatable,就不需要生成代码了,我们可以更多地专注于编写令人惊叹的应用程序,而不是普通的任务。props是一个getter of equatable,它接受我们想要的属性。
虽然它不需要关注它,但我只提供属性来支持它,它并不重要,但我建议您在这里中阅读更多关于它的内容。
https://stackoverflow.com/questions/64316700
复制相似问题