Добавление и удаление объектов из списка в flutter

#list #flutter #dart #mobile #collections

Вопрос:

У меня есть список динамических типов с именем 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(
например,
cardData.субъекты[
subjectIndex]);
},

                                               leading: CircleAvatar(
                                                backgroundColor:
                                                    AsasColors().white,
                                                backgroundImage:
                                                    NetworkImage(
                                                        e.profilePicture),
                                              ),
                                              title: MediumRegularFont(
                                                string: e.name,
                                              ),),
 

Пожалуйста, помогите мне действительно устать от этой проблемы!

Комментарии:

1. Вы вызываете setState() после добавления или удаления объекта?

2. нет, я пишу этот метод в классе ChangeNotifier с notifyListeners() в конце этого метода, и я завернул свою плитку списка в Consumer

Ответ №1:

Как вы упомянули 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 amp;amp;
      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 amp;amp; 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 метод вернет -1 , если элемент не был найден в списке. вы можете использовать и другие методы List().every , такие как

(Вместо Set этого я рекомендую вам использовать Map для удобства чтения кода и снижения сложности)

Комментарии:

1. спасибо за ваш ответ, я делал это раньше, но на самом деле я новичок в этом файле и не знаю, что вводить в методе contains, должен ли я проверить это сейчас ? если (этот.Выбранный список.содержит( {идентификатор учителя,идентификатор предмета}))??

2. @FarisShomali я обновил свой ответ, я не знал, что вы использовали наборы в первый раз