Ответ
В Flutter есть два фундаментальных типа виджетов с разными жизненными циклами: StatelessWidget и StatefulWidget.
StatelessWidget
Иммутабельный виджет, который описывает часть UI, зависящую только от своих конфигурационных параметров (final поля, переданные в конструктор). Его жизненный цикл прост:
- Конструктор: Принимает
keyи другие параметры. - build(BuildContext context): Вызывается фреймворком, когда виджет должен отрисоваться.
- Уничтожение: Экземпляр может быть собран сборщиком мусора. Если внутри
buildсоздаются подписки или контроллеры (что не рекомендуется), их нужно управлять через родительскийStatefulWidget.
class MyStatelessButton extends StatelessWidget {
const MyStatelessButton({
super.key,
required this.label,
required this.onPressed,
});
final String label;
final VoidCallback onPressed;
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: onPressed,
child: Text(label),
);
}
}
StatefulWidget
Виджет, который может менять свое состояние во времени. Его жизненный цикл сложнее и сосредоточен в отдельном объекте State.
Последовательность методов State объекта:
- createState() (метод
StatefulWidget) - mounted = true
- initState()
- didChangeDependencies()
- build() (многократно)
- didUpdateWidget() (при обновлении конфигурации)
- setState() (триггер из кода)
- deactivate()
- dispose()
- mounted = false
Ключевое отличие: StatefulWidget сам по себе — это всего лишь конфигурация (и он пересоздается при каждом обновлении родителя). Долгоживущая логика и состояние хранятся в ассоциированном объекте State, который фреймворк может переиспользовать при обновлении родительского виджета с тем же runtimeType и key.