Добавление данных из одного списка виджетов в другой список во Flutter

Итак, у меня есть виджет (а), который содержит анимированный список и пустой список виджетов (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, он не распознает, что они одинаковы из-за разницы в хэш-кодах. Есть ли способ переопределить хэш-код и сравнить два виджета, используя другой метод?

Публикуйте содержимое своих страниц (A и B)

dm_tr 20.12.2020 21:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
1
433
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема здесь в том, что когда вы выталкиваете страницу, предыдущая страница все еще имеет свое предыдущее состояние. Таким образом, все, что удалено из выбранного списка, останется на старой странице. Какую систему управления состоянием вы используете?

Я использую seState. Я думаю, что проблема связана с HashCode объектов в списке (workoutsObject). Каждый раз, когда я загружаю виджет, объект тренировки воссоздается в состоянии инициализации с новыми хэш-кодами, поэтому, когда я сравниваю виджет с другим виджетом в selectedList, он не распознает, что они одинаковы из-за разницы в хэш-кодах. Есть ли способ переопределить хэш-код и сравнить два виджета, используя другой метод?

Saeed 21.12.2020 10:37

Да, флаттер плохо сравнивает 2 объекта. Equitable — хороший пакет для сравнения. Он использует равенство значений вместо равенства экземпляров.

Scott Godfrey 21.12.2020 14:12

Это применимо к этому случаю: я хочу сравнить два виджета, а не объекты?

Saeed 21.12.2020 14:34

В этом я не уверен. Мне никогда не приходилось сравнивать виджеты. Хотя виджеты - это объекты.

Scott Godfrey 21.12.2020 16:40

Хорошо, на самом деле у меня есть два списка объектов, один из которых я передаю с экрана (а), и изначально он пуст. Другой создан на экране b и содержит несколько объектов. То, что я пытаюсь сделать, это сравнить, существует ли объект из b в a, и если да, я удаляю его, а если нет, добавляю. Все работает отлично, за исключением того, что когда я выталкиваю из b в a. После появления и повторного перехода к экрану b список (a) передается и с последними обновлениями, но когда я нажимаю на уже существующий объект, метод его удаления не работает, однако он работал до появления.

Saeed 21.12.2020 19:30

Я знаю, что это может быть не совсем ясно, но это действительно раздражает

Saeed 21.12.2020 19:31

Лучше всего использовать какую-нибудь внешнюю систему управления состоянием, например GetX, Bloc или RxDart. Таким образом, вы можете ссылаться на списки на любой необходимой странице, и они сохранят свое состояние независимо от этого.

Scott Godfrey 21.12.2020 19:45

Другие вопросы по теме