Выбор ответа Junior Жизненный цикл обновлено

Flutter: Theme.of в initState

Вопрос

Почему Theme.of(context) в initState приводит к ошибке, а в didChangeDependencies нет?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Зависеть от InheritedWidget разрешено только начиная с didChangeDependencies. context доступен уже в initState (элемент существует), но dependOnInheritedWidgetOfExactType там запрещён: фреймворк ещё не готов регистрировать зависимость.

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

  1. В initState ещё нет context: он появляется только при первом вызове build
  2. Зависеть от InheritedWidget разрешено только начиная с didChangeDependenciesправильный ответ
  3. Тема загружается асинхронно и в момент initState ещё не готова, её надо дождаться
  4. Ошибки нет: в initState можно вызывать любые of(context), если State смонтирован

Разбор

context доступен уже в initState (элемент существует), но dependOnInheritedWidgetOfExactType там запрещён: фреймворк ещё не готов регистрировать зависимость. Сразу после initState вызывается didChangeDependencies, где это безопасно, и он же вызовется снова, когда тема поменяется. Тема ничего не грузит асинхронно.

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

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