Класс BuildContext
Интерфейс BuildContext передают в
build
и в колбэки виджетов. Через него ищут
InheritedWidget,
состояние предков и объекты отрисовки.
Методы поиска перечислены в таблице ниже.
Синтаксис
Widget build(BuildContext context) {
Theme.of(context);
return const SizedBox.shrink();
}
Методы
| Метод | Описание |
|---|---|
findAncestorStateOfType |
Поднимается по дереву элементов и возвращает State нужного типа или null, если предка нет. Давайте разберём вызов на примерах.
|
findAncestorWidgetOfExactType |
Возвращает конфигурацию Widget у предка или null. Давайте разберём вызов на примерах.
|
dependOnInheritedWidgetOfExactType |
Подписывает элемент на InheritedWidget предка.
|
findRenderObject |
Возвращает RenderObject элемента, если он уже создан.
|
Пример
Давайте прочитаем Theme через BuildContext:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo)),
home: Scaffold(
body: Center(
child: ContextReader(),
),
),
),
);
}
class ContextReader extends StatelessWidget
{
const ContextReader({super.key});
@override
Widget build(BuildContext context)
{
final primary = Theme.of(context).colorScheme.primary;
return Text('abcde', style: TextStyle(color: primary));
}
}
На экране BuildContext даст доступ к Theme и окрасит 'abcde'.
Пример
Давайте получим размер экрана через MediaQuery.of(context):
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: WidthLabel(),
),
),
),
);
}
class WidthLabel extends StatelessWidget
{
const WidthLabel({super.key});
@override
Widget build(BuildContext context)
{
final w = MediaQuery.sizeOf(context).width;
return Text('12345 $w');
}
}
На экране BuildContext прочитает ширину и допишет её к '12345'.
Смотрите также
-
виджет
Builder,
который создаёт новыйBuildContextдля колбэка -
класс
InheritedWidget,
к которому обращаются через context -
класс
Widget,
чьи элементы несутBuildContext -
класс
State,
у которого есть поле context