#flutter #dart
#flutter #dart
Вопрос:
Итак, у меня есть виджет (a), который содержит анимированный список и пустой список виджетов (SelectedWorkoutsList). Затем, нажав на любой из виджетов в списке, я перехожу к другому виджету (b) и передаю SelectedWorkoutsList, который все еще пуст, с помощью Navigator. между тем в widget (b) у меня есть SelectedWorkoutsList), который по-прежнему пуст, и другой список (WorkoutObjects), который содержит виджеты. После выбора любого из его виджетов виджет должен быть добавлен в список SelectedWorkoutsList, переданный из виджета (a), и если пользователь нажал еще раз на тот же виджет, он должен быть удален. Все это работает отлично, моя проблема в том, что после добавления виджетов и возврата к первому виджету (a), а затем перехода к (b) У меня все еще есть этот SelectedWorkoutsList, но если я выберу виджет, который я уже выбрал перед появлением, он добавит его как дубликат, в то время как он должен удалитьэто.
Я использую это условие if, чтобы проверить, был ли этот виджет уже выбран или нет.
onTap: () {
if(!selectedWorkoutsList.contains(workoutObjects[index])) {
selectedWorkoutsList.add(workoutObjects[index]);
}else{
selectedWorkoutsList.remove(workoutObjects[index]);
}
print(selectedWorkoutsList.length);
},
Итак, у меня есть список workoutObjects, который содержит виджеты и onTap, я проверяю, содержит ли selectedWorkoutsList виджет, который пользователь использовал из workoutObjects, да, он удален, нет, он добавлен. он работает нормально, за исключением случаев, когда я возвращаюсь назад, а затем снова перемещаюсь.
Я использую seState. Я думаю, что проблема связана с хэш-кодом объектов в списке (workoutsObject). Каждый раз, когда я загружаю виджет, workoutObject воссоздается в состоянии инициализации с новыми хэш-кодами, поэтому, когда я сравниваю виджет с другим виджетом в selectedList, он не распознает, что они одинаковые из-за разницы в хэш-кодах. Есть ли способ переопределить хэш-код и сравнить два виджета, используя другой метод?
Комментарии:
1. Публикуйте содержимое своих страниц (A amp; B)
Ответ №1:
Проблема здесь в том, что когда вы открываете страницу, предыдущая страница все еще имеет свое предыдущее состояние. Таким образом, все, что удалено из выбранного списка, все равно будет на старой странице. Какую систему управления состоянием вы используете?
Комментарии:
1. Я использую seState. Я думаю, что проблема связана с хэш-кодом объектов в списке (workoutsObject). Каждый раз, когда я загружаю виджет, workoutObject воссоздается в состоянии инициализации с новыми хэш-кодами, поэтому, когда я сравниваю виджет с другим виджетом в selectedList, он не распознает, что они одинаковые из-за разницы в хэш-кодах. Есть ли способ переопределить хэш-код и сравнить два виджета, используя другой метод?
2. Да, flutter плохо сравнивает 2 объекта. Equitable — хороший пакет для сравнения. Он использует равенство значений вместо равенства экземпляров.
3. Это применимо к этому случаю: я хочу сравнить два виджета, а не объекты?
4. В этом я не уверен. Мне никогда не приходилось сравнивать виджеты. Хотя виджеты являются объектами.
5. Хорошо, на самом деле у меня есть два списка объектов, я передаю один из них с экрана (a), и изначально он пуст. Другой создается на экране b и содержит некоторые объекты. Что я пытаюсь сделать, так это сравнить, существует ли объект из b в a, и если да, я удаляю его, а если нет, я добавляю его. Все работает отлично, за исключением того, что когда я перемещаюсь из b в a. После появления и повторного перехода к экрану b список (a) передается и с последними обновлениями, но когда я нажимаю на объект, который уже существует, метод его удаления не работает, однако он работал до появления.