Flutter Dart - 检查类的两个实例之间的相等性

Flutter Dart - Checking equality between two instances of a class

提问人:SylvainJack 提问时间:8/21/2022 最后编辑:SylvainJack 更新时间:8/21/2022 访问量:437

问:

我为一个包含许多属性的复杂对象定义了一个类。我重新定义了这个类中的相等属性:如果 on 属性相同,则对象的实例等于另一个实例。

class CarnetWord {
  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    if (runtimeType != other.runtimeType) return false;
    return other is CarnetWord && other.idDico == idDico;
  }

  @override
  int get hashCode => idDico.hashCode;

  int idDico;
  int idCarnet;
  int repeatWrong;
  int repeatRight;
  int sayWrong;
  int sayRight;
  int oralTranslateWrongEng;
  int oralTranslateRightEng;
  int writtenTranslateWrongEng;
  int writtenTranslateRightEng;
  int oralTranslateWrongFr;
  int oralTranslateRightFr;
  int writtenTranslateWrongFr;
  int writtenTranslateRightFr;
  int copyRight;
  int copyWrong;
  int writeRight;
  int writeWrong;
  DateTime repeatLast;
  DateTime sayLast;
  DateTime oralTranslateLastEng;
  DateTime writtenTranslateLastEng;
  DateTime oralTranslateLastFr;
  DateTime writtenTranslateLastFr;
  DateTime copyLast;
  DateTime writeLast;
  double wordMastery;

因此,如果 IdDico 相同,则 CarnetWord 等于另一个 CarnetWord。

现在在检查这种相等性时:我发现自己必须在代码中指定所有其他属性。这正常吗?或者有没有办法只指定 IdDico 等。 下面 : 我必须为所有其他属性指定“弥补”值,而唯一重要的属性是 idDico。

代码如下:

for (int idDico in activite.listeMots) {
      if (_carnetWordBank.contains(CarnetWord(
              idDico: idDico,
              idCarnet: _carnetWordBank.length - 1,
              repeatWrong: 0,
              repeatRight: 0,
              sayWrong: 0,
              sayRight: 0,
              oralTranslateWrongEng: 0,
              oralTranslateRightEng: 0,
              writtenTranslateWrongEng: 0,
              writtenTranslateRightEng: 0,
              oralTranslateWrongFr: 0,
              oralTranslateRightFr: 0,
              writtenTranslateWrongFr: 0,
              writtenTranslateRightFr: 0,
              copyWrong: 0,
              copyRight: 0,
              writeWrong: 0,
              writeRight: 0,
              repeatLast: DateTime.fromMicrosecondsSinceEpoch(0),
              sayLast: DateTime.fromMicrosecondsSinceEpoch(0),
              oralTranslateLastEng: DateTime.fromMicrosecondsSinceEpoch(0),
              writtenTranslateLastEng: DateTime.fromMicrosecondsSinceEpoch(0),
              oralTranslateLastFr: DateTime.fromMicrosecondsSinceEpoch(0),
              writtenTranslateLastFr: DateTime.fromMicrosecondsSinceEpoch(0),
              copyLast: DateTime.fromMicrosecondsSinceEpoch(0),
              writeLast: DateTime.fromMicrosecondsSinceEpoch(0),
              wordMastery: 0)) ==
          true) {
        _list.add(_carnetWordBank
            .firstWhere((element) => element.idDico == idDico)
            .idCarnet);
      } 

同样,当我想“初始化”类的新实例时: 示例:我想_newWord成为CarnetWord的实例,在初始化它时是否必须指定所有属性?

感谢您的帮助:)

Flutter Dart 对象 相等

评论

0赞 Md. Yeasin Sheikh 8/21/2022
使用等式可以更容易

答:

1赞 Robert Sandberg 8/21/2022 #1

如果中的属性既不默认为值,也不可为 null,则在创建它的新实例时必须指定所有属性。CarnetWord

但是你的循环可以被“改进”,或者至少是简化,而不使用相等运算符。当您已经有两个对象并希望检查它们是否相等时,请考虑使用相等运算符。

相反,我会像这样做你的循环:

for (int idDico in activite.listeMots) {
  if (_carnetWordBank.where((e) => e.idDico == idDico).isNotEmpty) {
    _list.add(...)
  }
}

或者在软件包的帮助下更好:collections

import 'package:collection/collection.dart';

for (int idDico in activite.listeMots) {
  final carnetWord = _carnetWordBank.firstWhereOrNull((e) => e.idDico == idDico)
  if (carnetWord != null) {
    _list.add(carnetWord.idCarnet)
  }
}

评论

0赞 SylvainJack 8/21/2022
感谢您的帮助。将尝试您的解决方案。但是,如果我将相等运算符与 Contains 一起使用,那么我必须指定所有属性?
0赞 Robert Sandberg 8/21/2022
是的。请看我回答的第一部分。