Ответ
StatefulWidget — это виджет, который хранит изменяемое состояние (State) в течение своего жизненного цикла. Он используется для частей UI, которые должны динамически реагировать на данные, пользовательский ввод или другие события.
Ключевая механика: StatefulWidget состоит из двух классов:
- Сам виджет (иммутабельный, пересоздаётся при перестроении родителя).
- Объект
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).