Ответ вслух Senior Виджеты и три дерева обновлено

Ключи во Flutter: зачем и какие

Вопрос

Когда во Flutter нужны ключи? Расскажите про виды ключей и типичные ошибки с ними.

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Образцовый ответ: «Ключ говорит элементу, какой новый виджет соответствует старому. По умолчанию сопоставление идёт по позиции и типу, и для статичного UI этого хватает.

Что должно прозвучать в ответе

  • Без ключа элементы сопоставляются по позиции и типу

  • Список Stateful-элементов с удалением или перестановкой требует `ValueKey` по стабильному id

  • `UniqueKey` в `build` сбрасывает состояние каждый кадр

  • `GlobalKey` для доступа к `State` и переноса поддерева, но он дорогой

  • Ключ по индексу не помогает при удалении и сортировке

  • Ключ влияет на сопоставление только среди соседей одного родителя (кроме GlobalKey)

Что могут спросить следом

  • Как ключом принудительно сбросить состояние формы?
  • Почему PageStorageKey полезен в вкладках?

Разбор

Образцовый ответ: «Ключ говорит элементу, какой новый виджет соответствует старому. По умолчанию сопоставление идёт по позиции и типу, и для статичного UI этого хватает. Проблема появляется в списках Stateful-элементов: удалили первый, и его State достаётся следующему, отметки и введённый текст «переезжают». Поэтому ставлю ValueKey(item.id) по стабильному идентификатору, а не по индексу. UniqueKey использую, когда хочу пересоздать элемент, например сбросить форму при смене пользователя, но создаю его один раз, а не в build. GlobalKey даёт доступ к State, как у Form, и позволяет перенести поддерево с состоянием, но он дорогой и уникален на всё приложение. Ещё полезен PageStorageKey: сохраняет позицию прокрутки между вкладками»

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

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