在飞镖中使用 "get Stringify" 和 "get props"

Use of "get Stringify" and "get props" in dart

import 'package:equatable/equatable.dart';

class Point extends Equatable {
  const Point(this.x, this.y);
  final int x;
  final int y;

  @override
  List<Object?> get props => [x, y];

  @override
  bool? get stringify => true;

  Point operator +(Point other) {
    return Point(x + other.x, y + other.y);
  }

  Point operator *(int other) {
    return Point(x * other, y * other);
  }
}

void main() {
  print(Point(1, 1) == Point(1, 1));

  print(Point(2, 1));
}

                                                                                     

“Stringify”和“get props”这段代码是做什么的? 假设“如果设置为 true,[toString] 方法将被覆盖以输出此实例的 [props]。”关于 Stringify 的使用。 “此实例的 [props]”是什么意思?

equatable 包的用途描述为:

A Dart package that helps to implement value based equality without needing to explicitly override == and hashCode.

为了实现这个目标,我们可以让我们的 classes 从 Equatable 扩展(或者将 EquatableMixinwith 一起使用),然后==hashCode.

的实施

但是 Equatable 无法在运行时检查对象以确定您的 class 定义了哪些字段。 Equatable 也不需要预编译步骤。此外,您可能不想在确定两个对象相等时比较对象的所有字段。

因此,Equatable 了解您想要比较的字段的方式是使用 props getter,如果使用 Equatable,则必须定义它。 getter 然后必须 return 一个对象列表,在确定两个对象是否相等时应该比较这些对象。

在幕后,只要有人在您的对象上调用 ==hashCodeEquatable 就会调用此 probs getter。

stringify getter 的目的是告诉 Equatable 除了 ==hashCode 之外,是否还应该实现 toString() 为您的 class。默认情况下,Dart 中的 toString() 方法只会告诉您对象的类型,例如 Instance of 'Point'.

如果 stringify returns true,则 Equatable 将使用 probs 中的 returned 值来构造自己的 toString() 方法列出了 probs 中每个元素的值(对应于 class 的每个字段)。

如果您已经希望 toString() 列出 class.

的每个字段的值,这只是一项额外的可选服务