提问人:SylvainJack 提问时间:8/21/2022 最后编辑:SylvainJack 更新时间:8/21/2022 访问量:437
Flutter Dart - 检查类的两个实例之间的相等性
Flutter Dart - Checking equality between two instances of a class
问:
我为一个包含许多属性的复杂对象定义了一个类。我重新定义了这个类中的相等属性:如果 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的实例,在初始化它时是否必须指定所有属性?
感谢您的帮助:)
答:
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
是的。请看我回答的第一部分。
评论