Что такое state в контексте управления состоянием (state management) в Flutter?

«Что такое state в контексте управления состоянием (state management) в Flutter?» — вопрос из категории State Management, который задают на 36% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Flutter state (состояние) — это любые данные, которые могут изменяться в течение жизненного цикла приложения и влиять на его отображение. Это центральное понятие для реактивных UI-фреймворков.

Основные типы состояния:

  • Эфемерное (локальное) состояние: Живет в рамках одного виджета (например, текущая страница в PageView, состояние анимации). Управляется через StatefulWidget и setState().
  • Состояние приложения (глобальное): Данные, к которым нужен доступ из разных частей приложения (например, данные авторизованного пользователя, настройки темы, корзина покупок). Для управления им используются специализированные решения: Provider, Riverpod, BloC, GetX.

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

Пример с Riverpod (StateProvider):

// 1. Объявление провайдера состояния (глобальный счетчик)
final counterProvider = StateProvider<int>((ref) => 0);

// 2. Виджет, который читает и обновляет это состояние
class CounterWidget extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    // 'watch' слушает изменения и перестраивает виджет при обновлении
    final count = ref.watch(counterProvider);

    return Column(
      children: [
        Text('Значение: $count'),
        ElevatedButton(
          onPressed: () {
            // 'read' получает провайдер для изменения состояния
            ref.read(counterProvider.notifier).state++;
          },
          child: Text('Увеличить'),
        ),
      ],
    );
  }
}

Выбор подхода к state management зависит от сложности приложения: для простых случаев хватит setState, для средних — Provider/Riverpod, для сложных бизнес-процессов — BloC с его четким разделением событий и состояний.