Жизненный цикл виджета в Flutter

В Flutter жизненный цикл виджета можно разделить на несколько фаз, и он тесно связан с состоянием виджета. Существуют два основных типа виджетов: Stateless (без состояния) и Stateful (с состоянием). Жизненный цикл StatelessWidget прост, так как он не изменяется после создания. Однако StatefulWidget имеет более сложный жизненный цикл, поскольку может изменяться со временем и содержит изменяемое состояние. Давайте сосредоточимся на жизненном цикле StatefulWidget.

Обзор жизненного цикла StatefulWidget

В StatefulWidget сам виджет неизменяемый, но у него есть ассоциированный объект State, который содержит изменяемое состояние. Жизненный цикл объекта State и управляет изменениями виджета.

Основные методы жизненного цикла State:

  1. createState():

    • Этот метод вызывается при первом создании StatefulWidget. Он возвращает объект State, который будет использоваться для управления жизненным циклом виджета.
    • Вызывается только один раз в течение жизненного цикла виджета.
  2. initState():

    • Вызывается при первом создании состояния. Здесь можно инициализировать переменные, запустить анимации или сделать запросы к API.
    • Вызывается один раз, когда объект состояния вставляется в дерево виджетов.
  3. didChangeDependencies():

    • Вызывается, когда виджет вставляется в дерево, а также когда зависимости состояния изменяются. Например, этот метод вызывается, когда изменяется унаследованный виджет, от которого зависит этот виджет.
    • Обычно используется для реакции на изменения зависимостей (например, InheritedWidget).
  4. build():

    • Это самый важный метод. Здесь создаётся UI виджета. Он вызывается каждый раз, когда виджет перерисовывается, что происходит при изменении состояния (например, когда вы вызываете setState()).
    • Может вызываться несколько раз в течение жизненного цикла виджета, когда необходимо его повторно отрисовать.
  5. didUpdateWidget():

    • Вызывается, когда родительский виджет перерисовывается и требует обновления этого виджета (например, из-за изменения конфигурации виджета).
    • Здесь можно сравнить старые и новые значения свойств и выполнить соответствующие действия.
  6. setState():

    • Этот метод не является частью методов жизненного цикла как такового, но является основным триггером для перерисовки виджета.
    • Вызов setState() помечает дерево виджетов как "грязное", заставляя Flutter перерисовать виджет, чтобы отразить обновлённое состояние.
  7. deactivate():

    • Вызывается, когда виджет удаляется из дерева виджетов, но может быть повторно вставлен перед окончательным удалением. Это происходит, когда виджет временно удаляется во время перестройки дерева.
  8. dispose():

    • Вызывается, когда объект State окончательно удаляется из дерева виджетов и больше не будет использоваться. Здесь нужно освободить ресурсы (например, стримы, слушатели, анимации и т.д.).
  9. reassemble():

    • Используется в сценариях отладки при горячей перезагрузке (hot reload). Позволяет разработчикам повторно собрать состояние во время горячей перезагрузки.

Типичный поток жизненного цикла

  1. createState()
  2. initState()
  3. didChangeDependencies()
  4. build()
  5. didUpdateWidget() (если родительский виджет изменился и передал новые данные)
  6. deactivate() (если временно удалён)
  7. dispose()

Резюме

По сути, жизненный цикл StatefulWidget в Flutter вращается вокруг создания и уничтожения ассоциированного объекта состояния, а также управления изменениями состояния, которые инициируют обновления пользовательского интерфейса. Понимание этих методов жизненного цикла необходимо для правильного управления ресурсами, выполнения асинхронных операций и контроля поведения виджета в ответ на изменения в окружении.