Назад к вопросам
Middle
232
questionbank
Каков жизненный цикл Stateful виджета в Flutter?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
createState(): Создается объектStateдля виджета.initState(): Инициализация состояния, подписка на стримы, анимации. Вызывается один раз при создании видPжета.didChangeDependencies(): Вызывается послеinitState()и при изменении зависимостей (например, InheritedWidget).build(): Построение пользовательского интерфейса. Вызывается при инициализации и при изменении состояния (setState()).didUpdateWidget(): Вызывается при обновлении конфигурации виджета родительским виджетом.setState(): Уведомляет фреймворк об изменении внутреннего состояния, что приводит к перерисовке (build).deactivate(): Вызывается при удаленииStateиз дерева виджетов (может произойти временно, например, при смене вкладок).dispose(): Очистка ресурсов: отписка от стримов, удаление контроллеров анимации. Вызывается перед окончательным удалениемStateиз памяти.
// Пример использования setState, показывающий изменение состояния
class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int _counter = 0;
@override
void initState() {
super.initState();
// Инициализация
// print('initState');
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
// Зависимости изменились
// print('didChangeDependencies');
}
@override
void didUpdateWidget(MyStatefulWidget oldWidget) {
super.didUpdateWidget(oldWidget);
// Виджет обновился
// print('didUpdateWidget');
}
void _incrementCounter() {
setState(() {
// Изменение состояния, приводит к перерисовке build
_counter++;
// print('setState: counter = $_counter');
});
}
@override
Widget build(BuildContext context) {
// Построение UI
// print('build');
return Scaffold(
appBar: AppBar(
title: Text('Counter Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
@override
void deactivate() {
super.deactivate();
// Виджет деактивирован
// print('deactivate');
}
@override
void dispose() {
// Очистка ресурсов
// print('dispose');
super.dispose();
}
}