Объясните три дерева Flutter
Вопрос
Расскажите, как Flutter превращает виджеты в пиксели: какие деревья есть и зачем их три.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Widget: неизменяемая конфигурация, создаётся на каждом `build`
Element: место в дереве, долгоживущий, держит `State`, это и есть `BuildContext`
RenderObject: раскладка, отрисовка, hit test, дорогой
При перестроении элемент сравнивает `runtimeType` и `key` и переиспользует себя и рендер-объект
Поэтому пересоздавать виджеты дёшево, а `const` позволяет вообще пропустить поддерево
Что могут спросить следом
- Что будет, если поменять тип виджета на том же месте?
- Где живёт
Stateи почему? - Как ключи влияют на сопоставление?
Разбор
Образцовый ответ: «Виджет это описание интерфейса, лёгкий неизменяемый объект. При каждом build создаются новые виджеты, и это нормально. Элемент это экземпляр виджета в конкретной позиции дерева: он долгоживущий, хранит State у Stateful-виджетов и реализует BuildContext. Рендер-объект отвечает за размер, позицию и отрисовку, он дорогой. Когда приходит новый виджет, элемент проверяет canUpdate: тот же runtimeType и тот же ключ. Если да, элемент остаётся, State сохраняется, рендер-объект просто получает новые свойства. Если нет, поддерево пересоздаётся. Три дерева нужны, чтобы декларативный подход «опиши весь UI заново» не стоил пересоздания дорогих объектов. const-виджеты дают ещё одну оптимизацию: тот же экземпляр, и Flutter не заходит в его поддерево»
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Ключи во Flutter: зачем и какие
Следующий вопрос
Flutter: где хранить состояние StatefulWidget
Ещё по теме «Виджеты и три дерева»
- Flutter: когда элемент переиспользуется
- Flutter: что такое BuildContext
- Виды ключей во Flutter
- StatelessWidget и StatefulWidget
- Widget, Element, RenderObject
- Flutter: когда нужен GlobalKey
- Flutter: удаление элемента списка без ключей
- Ключи и их назначение