#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 я обновил свой ответ, я не знал, что вы использовали наборы в первый раз