Ответ
В 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 с его четким разделением событий и состояний.