Расскажи про жизненный цикл виджета в Flutter

«Расскажи про жизненный цикл виджета в Flutter» — вопрос из категории Жизненный цикл, который задают на 36% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Flutter есть два фундаментальных типа виджетов с разными жизненными циклами: StatelessWidget и StatefulWidget.

StatelessWidget

Иммутабельный виджет, который описывает часть UI, зависящую только от своих конфигурационных параметров (final поля, переданные в конструктор). Его жизненный цикл прост:

  1. Конструктор: Принимает key и другие параметры.
  2. build(BuildContext context): Вызывается фреймворком, когда виджет должен отрисоваться.
  3. Уничтожение: Экземпляр может быть собран сборщиком мусора. Если внутри build создаются подписки или контроллеры (что не рекомендуется), их нужно управлять через родительский StatefulWidget.
class MyStatelessButton extends StatelessWidget {
  const MyStatelessButton({
    super.key,
    required this.label,
    required this.onPressed,
  });

  final String label;
  final VoidCallback onPressed;

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: Text(label),
    );
  }
}

StatefulWidget

Виджет, который может менять свое состояние во времени. Его жизненный цикл сложнее и сосредоточен в отдельном объекте State.

Последовательность методов State объекта:

  1. createState() (метод StatefulWidget)
  2. mounted = true
  3. initState()
  4. didChangeDependencies()
  5. build() (многократно)
  6. didUpdateWidget() (при обновлении конфигурации)
  7. setState() (триггер из кода)
  8. deactivate()
  9. dispose()
  10. mounted = false

Ключевое отличие: StatefulWidget сам по себе — это всего лишь конфигурация (и он пересоздается при каждом обновлении родителя). Долгоживущая логика и состояние хранятся в ассоциированном объекте State, который фреймворк может переиспользовать при обновлении родительского виджета с тем же runtimeType и key.