Flutter BuildContext
dart flutterBuildContext
— это объект, который предоставляет доступ к элементу дерева.
BuildContext
— это не отдельный объект, а абстрактный класс.
Element
(например StatelessElement
) — это его реализация.
Фактически получаем сам Element, но работаем через интерфейс BuildContext
.
BuildContext
даёт доступ к другим частям дерева, так как у Element
есть ссылки на родителя, детей и т.д.
Например, получение темы через Theme.of(context)
,
это просто поиск соответствующего InheritedWidget
через Element
.
В метод of
передаётся соответствующий контекст и
происходит подписка к ближайшему Theme
.
Мы могли бы получить то же самое с:
context.dependOnInheritedWidgetOfExactType<Theme>();
Этот метод ищет ближайший InheritedWidget
определённого типа вверх по дереву элементов и подписывает текущий элемент на его обновления.
Вызов .of(context) и оптимизации
Если сделать несколько вызовов .of(context)
, то первый поиск ищет нужный InheritedWidget
за O(n)
, но он сразу же кешируется
и последующие вызовы выполняются за O(1)
.
Регистрируется только одна подписка в build
.
Следующие вызовы в том же build
не создают лишних подписок.
Предварительное помещение результат вызова .of(context)
в final
,
скорее больше в вопросу читаемости, чем оптимизации.