Flutter BuildContext

dart flutter

BuildContext — это объект, который предоставляет доступ к элементу дерева.

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, скорее больше в вопросу читаемости, чем оптимизации.