在 flutter 列表中添加和删除对象
Adding and removing objects from a list in flutter
我有一个名为 selectedList 的动态列表,它应该包含一个对象列表。
每个对象由 teacherId 和 subjectId 组成,
像这样 [ {1,2},{4,9},{7,3} ... 等]
我想要实现的是,我可以在这个列表中删除和添加对象,如果对象存在,则应将其删除,如果不存在,则应将其添加。
我试过 contain 方法,但没用!
加法
List<dynamic> selectedList = [];
void addTeacher(Teachers teacherId, Subjectt subjectId) {
if (this.selectedList.contains({ *** this method is not working*** })) {
this.selectedList.remove({teacherId, subjectId});
this.myColor = Colors.grey;
print('removed teacher => ${teacherId.toString()}');
} else {
this.selectedList.add({teacherId, subjectId});
this.myColor = AsasColors().blue;
print('added teacher => ${teacherId.toString()}');
}
notifyListeners();
print(selectedList);}
我调用方法的地方
ListTile(
onTap: () {
card.addTeacher(
e,
cardData.subjects[
subjectIndex]);
},
leading: CircleAvatar(
backgroundColor:
AsasColors().white,
backgroundImage:
NetworkImage(
e.profilePicture),
),
title: MediumRegularFont(
string: e.name,
),),
请帮助我真的厌倦了这个问题!
正如您提到的 Object
并且由于 contains
方法不起作用
...
if (this.selectedList.contains({ *** this method is not working*** })) ...
步骤 1
我想您正在对对象使用 contains 而没有覆盖它们的哈希码和相等性运算符
例如:
class Teacher {
String id;
String name;
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is Teacher &&
other.id == id;
}
@override
int get hashCode => id.hashCode;
}
第 2 步
由于您在列表中使用 Set
,因此您必须以不同的方式对它们进行比较
同时删除 this
关键字,这不是必需的
List<Set> selectedList = [];
void addTeacher(Teachers teacherId, Subjectt subjectId) {
if (selectedList.indexWhere((element) =>
element.first == teacherId && element.last == subjectId)) != -1 ) {
selectedList.remove({teacherId, subjectId});
myColor = Colors.grey;
print('removed teacher => ${teacherId.toString()}');
} else {
selectedList.add({teacherId, subjectId});
myColor = AsasColors().blue;
print('added teacher => ${teacherId.toString()}');
}
notifyListeners();
print(selectedList);
}
如果在列表中找不到该元素,List().indexWhere
方法将 return -1
。您也可以使用其他方法,例如 List().every
(而不是 Set
,我建议您使用 Map
以提高代码可读性并降低复杂性)
我有一个名为 selectedList 的动态列表,它应该包含一个对象列表。 每个对象由 teacherId 和 subjectId 组成, 像这样 [ {1,2},{4,9},{7,3} ... 等]
我想要实现的是,我可以在这个列表中删除和添加对象,如果对象存在,则应将其删除,如果不存在,则应将其添加。
我试过 contain 方法,但没用!
加法
List<dynamic> selectedList = [];
void addTeacher(Teachers teacherId, Subjectt subjectId) {
if (this.selectedList.contains({ *** this method is not working*** })) {
this.selectedList.remove({teacherId, subjectId});
this.myColor = Colors.grey;
print('removed teacher => ${teacherId.toString()}');
} else {
this.selectedList.add({teacherId, subjectId});
this.myColor = AsasColors().blue;
print('added teacher => ${teacherId.toString()}');
}
notifyListeners();
print(selectedList);}
我调用方法的地方
ListTile(
onTap: () { card.addTeacher( e, cardData.subjects[ subjectIndex]); },
leading: CircleAvatar(
backgroundColor:
AsasColors().white,
backgroundImage:
NetworkImage(
e.profilePicture),
),
title: MediumRegularFont(
string: e.name,
),),
请帮助我真的厌倦了这个问题!
正如您提到的 Object
并且由于 contains
方法不起作用
...
if (this.selectedList.contains({ *** this method is not working*** })) ...
步骤 1
我想您正在对对象使用 contains 而没有覆盖它们的哈希码和相等性运算符
例如:
class Teacher {
String id;
String name;
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is Teacher &&
other.id == id;
}
@override
int get hashCode => id.hashCode;
}
第 2 步
由于您在列表中使用 Set
,因此您必须以不同的方式对它们进行比较
同时删除 this
关键字,这不是必需的
List<Set> selectedList = [];
void addTeacher(Teachers teacherId, Subjectt subjectId) {
if (selectedList.indexWhere((element) =>
element.first == teacherId && element.last == subjectId)) != -1 ) {
selectedList.remove({teacherId, subjectId});
myColor = Colors.grey;
print('removed teacher => ${teacherId.toString()}');
} else {
selectedList.add({teacherId, subjectId});
myColor = AsasColors().blue;
print('added teacher => ${teacherId.toString()}');
}
notifyListeners();
print(selectedList);
}
如果在列表中找不到该元素,List().indexWhere
方法将 return -1
。您也可以使用其他方法,例如 List().every
(而不是 Set
,我建议您使用 Map
以提高代码可读性并降低复杂性)