Выбор ответа Middle Виджеты и три дерева спрашивают часто обновлено

Flutter: удаление элемента списка без ключей

Вопрос

Список из StatefulWidget с чекбоксами, ключей нет. Пользователь отметил первый элемент и удалил его. Что увидит?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Отметка перейдёт на элемент, который стал первым: состояние сопоставлено по позиции. Без ключей элементы сопоставляются с новыми виджетами по позиции и типу.

Варианты ответа

  1. Всё корректно: Flutter сравнивает данные виджетов и сам найдёт нужный State
  2. Отметка перейдёт на элемент, который стал первым: состояние сопоставлено по позицииправильный ответ
  3. Все чекбоксы сбросятся, потому что список пересоздаётся целиком при удалении
  4. Приложение упадёт с ошибкой о дублирующихся элементах в одном родителе

Разбор

Без ключей элементы сопоставляются с новыми виджетами по позиции и типу. Первый элемент со своим State (где хранится отметка) получает виджет бывшего второго, а последний элемент удаляется. Отметка «переезжает». Решение: ValueKey(item.id). Сброса всех или падения не будет, именно поэтому баг коварный.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.