Ответ
В Flutter есть две фундаментальные категории виджетов, основанные на управлении состоянием, и несколько важных специализированных типов.
1. По управлению состоянием
-
StatelessWidget: Неизменяемый виджет. Он конфигурируется один раз при создании и не меняется в течение жизненного цикла. Используется для статического или вычисляемого на основе входных параметров (finalсвойств) контента.class GreetingText extends StatelessWidget { final String name; // Конфигурация через конструктор const GreetingText({super.key, required this.name}); @override Widget build(BuildContext context) { // Виджет перестраивается, только если изменились `key` или `name` return Text('Привет, $name!'); } } -
StatefulWidget: Виджет, который может меняться в ответ на пользовательский ввод или другие события. Он состоит из двух классов:- Сам
StatefulWidget(неизменяемый, какStatelessWidget). -
Объект
State, который сохраняет mutable-состояние и содержит методbuild.class CounterWidget extends StatefulWidget { const CounterWidget({super.key}); @override State<CounterWidget> createState() => _CounterWidgetState(); }
class _CounterWidgetState extends State
{ int _count = 0; // Изменяемое состояние void _increment() { setState(() { // Вызов setState перестраивает виджет _count++; }); }
@override Widget build(BuildContext context) { return ElevatedButton( onPressed: _increment, child: Text('Нажато $_count раз'), ); } }
- Сам
2. Специализированные виджеты
InheritedWidget: Эффективный механизм для передачи данных вниз по дереву виджетов без явной их передаче через конструкторы каждого виджета. Основа дляProvider,Theme,MediaQuery.RenderObjectWidget: Низкоуровневый виджет, который создает/обновляетRenderObject— объект, отвечающий за вычисление layout и отрисовку.SingleChildRenderObjectWidget(например,Padding) иMultiChildRenderObjectWidget(например,Row) — его потомки.StatefulBuilder&LayoutBuilder: Виджеты для создания локального состояния или реагирования на изменения constraints родителя непосредственно в методеbuild.