添加到另一个列表的Dart列表在清空第一个列表时变为空



我有以下用户定义的对象-

class PhoneBookContact {
String? phoneBookContact;
List<ContactNumber>? contactNumbers;
PhoneBookContact(this.phoneBookContact, this.contactNumbers);
}
class ContactNumber {
String phone;
bool availableOnBol;
ContactNumber(this.phone, this.availableOnBol);
}

在我的主要方法中,我为ContactNumber类创建了一个列表,然后将该ContactNumber列表添加到PhoneBookContact列表的contactNumbers属性。这些都是在for循环中完成的。

我遇到的问题是,当我在将这些项目添加到PhoneBookContact列表的contactNumbers属性后清除contactNumbers列表时,我也看到那些从PhoneBookContact列表中清除的项目,我觉得很奇怪,或者我可能不认为这是正确的方式。

List<PhoneBookContact> phoneBookContacts = [];
List<ContactNumber> contactNumbers = [];
for (var contact in contacts) {
contactNumbers.clear();
if (contact.phones.isNotEmpty) {
for (var phone in contact.phones) {
if (true) {
contactNumbers.add(ContactNumber(phone.number, true));
} else {
contactNumbers.add(ContactNumber(phone.number, false));
}
}
}
phoneBookContacts
.add(PhoneBookContact(contact.displayName, contactNumbers));
}

PhoneBookContact构造函数不复制列表。它接受对列表的引用并记住它。

由于清除了列表的每个循环,但重用相同的列表实例,所有的PhoneBookContacts将具有相同的列表。

让我们稍微清理一下你的方法:

List<PhoneBookContact> phoneBookContacts = [];
for (var contact in contacts) {
List<ContactNumber> contactNumbers = [];
for (var phone in contact.phones) {
final condition = true; // should be your complicated expression        
contactNumbers.add(ContactNumber(phone.number, condition));
}
phoneBookContacts.add(PhoneBookContact(contact.displayName, contactNumbers));
}

除了消除一些混乱之外,它还确保每个循环实例化一个新列表,以便每个PhoneBookContact都有自己的列表

最新更新