Итак, у меня есть виджет (а), который содержит анимированный список и пустой список виджетов (SelectedWorkoutsList). Затем, коснувшись любого из виджетов в списке, я перехожу к другому виджету (b) и передаю SelectedWorkoutsList, который все еще пуст, с помощью Navigator. тем временем в виджете (b) у меня есть SelectedWorkoutsList), который все еще пуст, и еще один список (WorkoutObjects), который содержит виджеты. После выбора любого из его виджетов виджет должен быть добавлен в список SelectedWorkoutsList, переданный из Widget (a), и если пользователь еще раз нажал на тот же виджет, он должен быть удален. Все это работает отлично, моя проблема в том, что после добавления виджетов и возврата к первому виджету (а), а затем перехода к (б) у меня все еще есть этот SelectedWorkoutsList, но если я выберу виджет, который я уже выбрал до появления, он добавит его как дубликат, в то время как он должен удалить его.
Я использую это условие if, чтобы проверить, был ли этот виджет уже выбран или нет.
onTap: () {
if (!selectedWorkoutsList.contains(workoutObjects[index])) {
selectedWorkoutsList.add(workoutObjects[index]);
}else{
selectedWorkoutsList.remove(workoutObjects[index]);
}
print(selectedWorkoutsList.length);
},
Итак, у меня есть список trainingObjects, который содержит виджеты и onTap, я проверяю, содержит ли selectedWorkoutsList виджет, который пользователь нажал изworkObjects, да, он удален или нет, он добавлен. он работает нормально, за исключением случаев, когда я возвращаюсь, а затем снова перемещаюсь.
Я использую seState. Я думаю, что проблема связана с HashCode объектов в списке (workoutsObject). Каждый раз, когда я загружаю виджет, объект тренировки воссоздается в состоянии инициализации с новыми хэш-кодами, поэтому, когда я сравниваю виджет с другим виджетом в selectedList, он не распознает, что они одинаковы из-за разницы в хэш-кодах. Есть ли способ переопределить хэш-код и сравнить два виджета, используя другой метод?
Проблема здесь в том, что когда вы выталкиваете страницу, предыдущая страница все еще имеет свое предыдущее состояние. Таким образом, все, что удалено из выбранного списка, останется на старой странице. Какую систему управления состоянием вы используете?
Я использую seState. Я думаю, что проблема связана с HashCode объектов в списке (workoutsObject). Каждый раз, когда я загружаю виджет, объект тренировки воссоздается в состоянии инициализации с новыми хэш-кодами, поэтому, когда я сравниваю виджет с другим виджетом в selectedList, он не распознает, что они одинаковы из-за разницы в хэш-кодах. Есть ли способ переопределить хэш-код и сравнить два виджета, используя другой метод?
Да, флаттер плохо сравнивает 2 объекта. Equitable — хороший пакет для сравнения. Он использует равенство значений вместо равенства экземпляров.
Это применимо к этому случаю: я хочу сравнить два виджета, а не объекты?
В этом я не уверен. Мне никогда не приходилось сравнивать виджеты. Хотя виджеты - это объекты.
Хорошо, на самом деле у меня есть два списка объектов, один из которых я передаю с экрана (а), и изначально он пуст. Другой создан на экране b и содержит несколько объектов. То, что я пытаюсь сделать, это сравнить, существует ли объект из b в a, и если да, я удаляю его, а если нет, добавляю. Все работает отлично, за исключением того, что когда я выталкиваю из b в a. После появления и повторного перехода к экрану b список (a) передается и с последними обновлениями, но когда я нажимаю на уже существующий объект, метод его удаления не работает, однако он работал до появления.
Я знаю, что это может быть не совсем ясно, но это действительно раздражает
Лучше всего использовать какую-нибудь внешнюю систему управления состоянием, например GetX, Bloc или RxDart. Таким образом, вы можете ссылаться на списки на любой необходимой странице, и они сохранят свое состояние независимо от этого.
Публикуйте содержимое своих страниц (A и B)