TLDR: Это управляется платформой .
Для тех, кто любит читать:
Начиная с самого начала. Метод runApp
берет ваш виджет приложения и вставляет его в дерево, согласно комментарию к методу ( binding.dart ):
Раздуйте указанный виджет и прикрепите его к экрану.
Когда это будет сделано, приложение StatelessWidget
(которое, очевидно, является Widget
) раздувается в Element
(Widget
комментарии класса в файле framework.dart )
Каждый раз, когда виджет помещается в дерево, он раздувается в
[Элемент], что означает виджет, который включен в дерево
несколько раз будет раздуто несколько раз.
Если вы посмотрите на абстрактный класс Element
в том же файле репозитория GitHub ( framework.dart ), вы увидите над ним комментарии:
Элементы имеют следующий жизненный цикл:
- Каркас создает элемент, вызывая [ Widget.createElement ]
на виджете, который будет использоваться в качестве начального элемента
конфигурации.
- Фреймворк вызывает [ mount ] для добавления вновь созданного
элемент к дереву в данном слоте в данном родителе. [Гора]
Метод отвечает за раздувание любых дочерних виджетов и вызов
[attachRenderObject] при необходимости, чтобы прикрепить любой связанный рендер
объекты в дерево рендеринга.
Эти два метода createElement
и mount
являются теми, которые отвечают за вызов метода build
.
Если вы посмотрите на класс StatelessWidget
, вы увидите, что он имеет переопределение для метода createElement
( framework.dart ). Который создает StatelessElement
объект и передает себя (this
) в качестве параметра конструктора. Обратите внимание, как класс StatelessElement
переопределяет метод build
и вызывает метод widget.build
(в этом случае widget
- это виджет вашего приложения, т.е. MyApp
). Это все еще не говорит нам, как вызывается метод build
. Если вы углубитесь в ComponentElement
(класс, который StatelessElement
является производным от - framework.dart ), вы увидите переопределенный метод mount
. В этом методе (который вызывается платформой) есть вызов метода _firstBuild
, который затем вызывает rebuild
, этот метод затем вызывает метод performRebuild
, что в конечном итоге вызывает метод build
.
Легко, правда?
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Это только я соединяю точки. Я не эксперт по Flutter - я буквально начал использовать Flutter неделю назад. Было бы хорошо, если бы некоторые опытные разработчики могли подтвердить или нет, если мое понимание механизмов, стоящих за виджетами, правильное.
РЕДАКТИРОВАТЬ: Ответы на вопросы комментариев
Раздувание (на мой взгляд) - это создание объекта в памяти (так что у фреймворка есть ссылка на него) и рендеринг его на экране.
Да, BuildContext
будет StatelessElement
, который содержит ссылку на само приложение