在 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 以提高代码可读性并降低复杂性)