Выбор ответа Junior Виджеты и три дерева обновлено
Flutter: Scaffold.of не находит Scaffold
Вопрос
Почему здесь Scaffold.of(context) бросает ошибку «Scaffold.of() called with a context that does not contain a Scaffold»?
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
drawer: const Drawer(),
body: ElevatedButton(
onPressed: () => Scaffold.of(context).openDrawer(),
child: const Text('Меню'),
),
);
}
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Контекст принадлежит HomePage, а он выше Scaffold, созданного в его же build. Поиск через of(context) идёт от элемента контекста вверх.
Варианты ответа
- Контекст принадлежит
HomePage, а он вышеScaffold, созданного в его жеbuildправильный ответ Scaffold.ofнельзя вызывать в обработчиках нажатий, только внутри методаbuild- Не хватает
MaterialAppнадScaffold, без негоScaffold.ofничего не находит Scaffoldещё не отрисован, нужно подождать кадр черезaddPostFrameCallback
Разбор
Поиск через of(context) идёт от элемента контекста вверх. Контекст build у HomePage это элемент самого HomePage, а Scaffold его потомок. Лечится Builder вокруг кнопки или отдельным виджетом: у него свой контекст ниже Scaffold. Для снекбаров сейчас обычно используют ScaffoldMessenger.of(context), который лежит в MaterialApp.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Виджеты и три дерева»
- Flutter: когда элемент переиспользуется
- Flutter: что такое BuildContext
- Виды ключей во Flutter
- StatelessWidget и StatefulWidget
- Widget, Element, RenderObject
- Flutter: когда нужен GlobalKey
- Flutter: удаление элемента списка без ключей
- Ключи и их назначение