Выбор ответа 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) идёт от элемента контекста вверх.

Варианты ответа

  1. Контекст принадлежит HomePage, а он выше Scaffold, созданного в его же buildправильный ответ
  2. Scaffold.of нельзя вызывать в обработчиках нажатий, только внутри метода build
  3. Не хватает MaterialApp над Scaffold, без него Scaffold.of ничего не находит
  4. Scaffold ещё не отрисован, нужно подождать кадр через addPostFrameCallback

Разбор

Поиск через of(context) идёт от элемента контекста вверх. Контекст build у HomePage это элемент самого HomePage, а Scaffold его потомок. Лечится Builder вокруг кнопки или отдельным виджетом: у него свой контекст ниже Scaffold. Для снекбаров сейчас обычно используют ScaffoldMessenger.of(context), который лежит в MaterialApp.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.