在flutter中使用Equatable扩展模型类有什么用

问题描述 投票:0回答:3
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”在这里可以做任何帮助吗?

flutter dart
3个回答
0
投票

我建议你阅读 Equatable 的文档。 Equatable 不是 flutter 的默认类,无论是谁将该代码添加到您的项目中,都必须故意包含该包

https://pub.dev/packages/equatable


0
投票

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


0
投票

在 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
包,你就不需要再这样做了;它会为您处理这个问题,使您的代码更干净、更简单。

其工作原理如下:

使用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
    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 被设计为仅适用于不可变对象,因此所有成员变量都必须是最终的

© www.soinside.com 2019 - 2024. All rights reserved.