Ответ вслух Junior Жизненный цикл спрашивают часто обновлено

Жизненный цикл StatefulWidget

Вопрос

Расскажите жизненный цикл StatefulWidget и что вы делаете в каждом методе.

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Образцовый ответ: «Виджет создаёт State в createState. Дальше initState вызывается один раз: тут создаю контроллеры, подписываюсь на стримы и запускаю начальную загрузку, super.initState() первой строкой.

Что должно прозвучать в ответе

  • `initState`: один раз, создать контроллеры и подписки, `super` первой строкой

  • `didChangeDependencies`: читать `InheritedWidget`, вызывается и при их изменении

  • `build`: чистый и быстрый, без побочных эффектов

  • `didUpdateWidget`: сравнить старый и новый виджет, перезапросить данные

  • `dispose`: освободить контроллеры и отменить подписки, `super` последней строкой

  • `mounted` после `await` перед `setState`

Что могут спросить следом

  • Почему нельзя Theme.of в initState?
  • Что будет, если не вызвать dispose у AnimationController?
  • Когда вызывается deactivate?

Разбор

Образцовый ответ: «Виджет создаёт State в createState. Дальше initState вызывается один раз: тут создаю контроллеры, подписываюсь на стримы и запускаю начальную загрузку, super.initState() первой строкой. Потом didChangeDependencies: здесь уже можно читать InheritedWidget, и он же вызовется, если тема или провайдер изменятся. build вызывается часто, поэтому он только строит UI. Если родитель передал новые параметры, приходит didUpdateWidget со старым виджетом: сравниваю, например, id и перезапрашиваю данные. При удалении deactivate, а затем dispose, где я освобождаю контроллеры и отменяю подписки, super.dispose() последней строкой. Отдельно слежу за асинхронностью: после каждого await проверяю mounted, иначе получу setState после dispose»

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

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