Выбор ответа Middle Виджеты и три дерева спрашивают часто обновлено
Flutter: удаление элемента списка без ключей
Вопрос
Список из StatefulWidget с чекбоксами, ключей нет. Пользователь отметил первый элемент и удалил его. Что увидит?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Отметка перейдёт на элемент, который стал первым: состояние сопоставлено по позиции. Без ключей элементы сопоставляются с новыми виджетами по позиции и типу.
Варианты ответа
- Всё корректно: Flutter сравнивает данные виджетов и сам найдёт нужный
State - Отметка перейдёт на элемент, который стал первым: состояние сопоставлено по позицииправильный ответ
- Все чекбоксы сбросятся, потому что список пересоздаётся целиком при удалении
- Приложение упадёт с ошибкой о дублирующихся элементах в одном родителе
Разбор
Без ключей элементы сопоставляются с новыми виджетами по позиции и типу. Первый элемент со своим State (где хранится отметка) получает виджет бывшего второго, а последний элемент удаляется. Отметка «переезжает». Решение: ValueKey(item.id). Сброса всех или падения не будет, именно поэтому баг коварный.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Виджеты и три дерева»
- Flutter: когда элемент переиспользуется
- Flutter: что такое BuildContext
- Виды ключей во Flutter
- StatelessWidget и StatefulWidget
- Widget, Element, RenderObject
- Код-ревью: список задач
- Flutter: Scaffold.of не находит Scaffold
- Flutter: что перестраивает setState