Какие основные виды виджетов существуют в Flutter?

«Какие основные виды виджетов существуют в Flutter?» — вопрос из категории Flutter виджеты, который задают на 36% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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: Виджет, который может меняться в ответ на пользовательский ввод или другие события. Он состоит из двух классов:

    1. Сам StatefulWidget (неизменяемый, как StatelessWidget).
    2. Объект 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.