Что такое StatefulWidget и как он работает?

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

Ответ

StatefulWidget — это виджет, который хранит изменяемое состояние (State) в течение своего жизненного цикла. Он используется для частей UI, которые должны динамически реагировать на данные, пользовательский ввод или другие события.

Ключевая механика: StatefulWidget состоит из двух классов:

  1. Сам виджет (иммутабельный, пересоздаётся при перестроении родителя).
  2. Объект State (мутабельный, сохраняется между перестроениями виджета).

Пример счётчика:

class CounterWidget extends StatefulWidget {
  const CounterWidget({super.key});

  @override
  State<CounterWidget> createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _count = 0; // Состояние хранится здесь

  void _increment() {
    // setState уведомляет фреймворк об изменении состояния
    // и запускает перестроение виджета
    setState(() {
      _count++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text('Текущее значение: $_count'),
        ElevatedButton(
          onPressed: _increment,
          child: const Text('Увеличить'),
        ),
      ],
    );
  }
}

Жизненный цикл State:

  • initState(): Вызывается один раз при создании объекта состояния. Идеально для инициализации данных, подписки на Stream.
  • didUpdateWidget(oldWidget): Вызывается при перестроении родительского виджета с новыми свойствами.
  • setState(fn): Планирует перестроение виджета с обновлённым состоянием.
  • dispose(): Вызывается перед удалением состояния. Обязателен для отписки от таймеров, StreamSubscription, чтобы избежать утечек памяти.

Когда использовать: Для форм, анимаций, таймеров или любого компонента с внутренним, изменяемым состоянием. Для сложного состояния приложения предпочтительнее использовать менеджеры состояний (BLoC, Provider).