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,
скорее больше в вопросу читаемости, чем оптимизации.
Для разработчиков React
Когда приходишь во Flutter после React, многие идеи кажутся похожими, но именно context может сильно запутать.
createContext в React и BuildContext во Flutter служат для разных целей.
Если вы хотите делать тоже самое, что делали с помощью React Context, но во Flutter, рассмотрите InheritedWidget.