Я пытался преобразовать приложение todo-list в виде флаттера, чтобы использовать библиотеку Redux флаттера для управления состоянием.
У меня есть StoreConnector, обертывающий ListView, который просматривает объекты List of Task.Добавление и удаление задач, конечно, выполняется через редуктор, который создает новый список с задачей, добавляемой или удаляемой из списка в зависимости от ситуации.
Добавление в список работает правильно, а первое удаление всегда работает правильно.Удаление только и всегда последнего (нижнего) элемента также будет работать до тех пор, пока не будет удален элемент выше нижнего.
Однако при удалении любого элемента выше нижней части списка первый удаленный элемент удаляется правильно, но после этого каждому элементу, который был ниже удаленного элемента, требуется два нажатия кнопки удаления, чтобы удалить задачу.
Отладка приложения показывает, что при первом нажатии кнопки удаления в данной задаче (кромев особых случаях) действие удаления содержит идентификатор задачи, соответствующий задаче, расположенной непосредственно над ней в списке.Таким образом, самая верхняя задача в списке содержит идентификатор только что удаленной задачи.
Дальнейшая отладка показывает, что при первом удалении (которое работает) дерево виджетов обновляется со всеми новымивиджеты, содержащие правильные задачи / идентификаторы.Это означает, что все:
TaskView
имеют правильные задачи / идентификаторы (виджет-контейнер с избыточностью для TaskCard) TaskCard
имеют правильные идентификаторы задачи / идентификаторы (виджет без сохранения состояния содержит RemoveTaskButton) RemoveTaskButton
имеет правильные задачи / идентификаторы (в контейнере RedEx есть обратный вызов removeTask) RemoveTaskAction
имеет правильные задачи / идентификаторы (действие избыточности) AppState
содержит список виджетов, который не содержит удаленную задачу.
Несмотря на то, что все виджеты / действия / класс данных, содержащие только задачи / идентификаторы, оставшиеся после удаления, первый раз кнопка удаления нажимается сразу после успешного удаления:
- при запуске RemoveTaskAction содержится идентификатор непосредственно предшествующей задачи.
- при попытке выполнитьудалить задачу, которая следовала сразу за удаленной задачей, эта операция RemoveTaskAction будет содержать идентификатор удаленной задачи.
- Поскольку удаленная задача / идентификатор не существует в дереве виджетов, это шоЭто невозможно.
Насколько я могу судить, такое поведение является ошибкой во Flutter или Redux.Если кто-то может указать на то, что я упускаю или делаю неправильно, пожалуйста, сделайте!
Исходный код (репозиторий Github)
Отладка снимков экрана РЕДАКТИРОВАТЬ: исправлен порядок скриншотов.Примечание: первое изображение из приложения, остальные из IDE.