class PushOtpResponse extends Equatable {
final bool? isSuccess;
final String? message;
const PushOtpResponse({this.isSuccess, this.message});
factory PushOtpResponse.fromJson(Map<String, dynamic> json) {
return PushOtpResponse(
isSuccess: json['isSuccess'] as bool?,
message: json['message'] as String?,
);
}
Map<String, dynamic> toJson() => {
'isSuccess': isSuccess,
'message': message,
};
@override
bool get stringify => true;
@override
List<Object?> get props => [isSuccess, message];
}
上面给出的模型类是使用 VSCode 的 json to dart 扩展创建的。有一个选项可以使用 equalable 来扩展类。那么,用 equatable 扩展模型类有什么用处吗?“stringify”在这里可以做任何帮助吗?
我建议你阅读 Equatable 的文档。 Equatable 不是 flutter 的默认类,无论是谁将该代码添加到您的项目中,都必须故意包含该包
Equatable 覆盖 == 和 hashCode,无需生成代码,甚至无需自己编写代码。
使用 Equatable,您可以
final resp = PushOtpResponse(
isSuccess: true,
message: 'Test',
);
final resp2 = PushOtpResponse(
isSuccess: true,
message: 'Test',
);
resp == resp2; // True with Equatable, False without
有关更多详细信息,您可以阅读公平的文档 https://pub.dev/packages/equatable
在 Dart 中,比较两个对象时,通常需要重写
==
运算符和 hashCode
来检查它们是否相等。这是一个简单的例子来说明为什么这是必要的:
class Website {
const Website(this.url);
final String url;
}
void main() {
final Website website = Website("Stackoverflow");
print(website == Website("Stackoverflow")); // Prints false
}
这会打印
false
,因为 Dart 将它们视为不同的对象,即使它们的内容相同。通常,您需要手动覆盖 ==
和 hashCode
来解决此问题。
但是,有了
Equatable
包,你就不需要再这样做了;它会为您处理这个问题,使您的代码更干净、更简单。
其工作原理如下:
import 'package:equatable/equatable.dart';
class Website extends Equatable {
const Website(this.url, this.name);
final String url;
final String name;
@override
List<Object> get props => [url, name];
}
props
列表告诉Equatable
要比较哪些字段。如果您同时包含 url
和 name
,它将比较两者。现在,您可以轻松比较两个
Website
对象:
void main() {
final site1 = Website("Stackoverflow", "Stack Overflow");
final site2 = Website("Stackoverflow", "Stack Overflow");
print(site1 == site2); // Prints true
print(site1 == Website("Google", "Google")); // Prints false
}
使用
Equatable
,您可以比较对象,而无需手动覆盖 ==
和 hashCode
,从而节省时间并避免额外的代码。
N.B. Equatable 被设计为仅适用于不可变对象,因此所有成员变量都必须是最终的