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