Что такое state (состояние) в контексте Dart и Flutter?

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

Ответ

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

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

Базовый пример: локальное состояние в StatefulWidget

class CounterWidget extends StatefulWidget {
  @override
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  // Переменная `_counter` — это и есть состояние.
  int _counter = 0;

  void _increment() {
    // Вызов setState() уведомляет Flutter, что состояние изменилось.
    // Это приводит к повторному вызову метода build() данного State объекта.
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    // UI перестраивается каждый раз, когда меняется _counter.
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text('Счётчик: $_counter', style: TextStyle(fontSize: 24)),
        ElevatedButton(
          onPressed: _increment,
          child: Text('Увеличить'),
        ),
      ],
    );
  }
}

Типы состояния в Flutter:

  1. Эфемерное (Ephemeral): Локальное состояние, живущее в одном виджете (как _counter выше). Управляется через setState().
  2. Управляемое (App state): Состояние, которым должны делиться несколько частей приложения (например, данные пользователя, корзина покупок). Для него используются решения вроде Provider, Riverpod, Bloc, GetX или Redux. Эти пакеты предоставляют механизмы для эффективного распространения изменений состояния и перерисовки только зависимых виджетов.

Принцип: Правильное управление состоянием — основа отзывчивого и предсказуемого Flutter-приложения.