← Назад к вопросам

Зачем использовать const конструкторы для виджетов?

1.7 Middle🔥 121 комментариев
#Flutter виджеты#Архитектура Flutter

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Const конструкторы в Flutter: стратегия оптимизации

Const конструкторы — не просто синтаксис, это ключевой механизм оптимизации во Flutter. Они дают компилятору и runtime информацию о том, что объект неизменяем, и позволяют применить агрессивную оптимизацию.

Как работают const конструкторы

Compile-time вычисление:

// Flutter видит, что объект создан с const
const text = Text('Hello');

// Компилятор создаёт ОДИН объект в памяти
// При каждом обращении к text — возвращает ссылку на тот же объект
// const Text('Hello') === const Text('Hello') // true!

Без const:

text = Text('Hello');

// Каждый раз создаётся НОВЫЙ объект в памяти
text = Text('Hello'); // другой объект!
text === Text('Hello') // false

Идентичность объектов и оптимизация

class Counter extends StatefulWidget {
  final String title;
  final Widget child;
  
  // ВАЖНО: const конструктор
  const Counter({
    required this.title,
    required this.child,
  });
  
  @override
  State<Counter> createState() => _CounterState();
}

class _CounterState extends State<Counter> {
  int _count = 0;
  
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        const Text('Title'), // CONST!
        Text('Count: $_count'),
        widget.child, // пришёл извне как const
      ],
    );
  }
}

Когда _count меняется и вызывается setState():

  • Text('Title') — не пересоздаётся (это const, идентичен прошлому)
  • Text('Count: $_count') — пересоздаётся (зависит от переменной)
  • widget.child — не пересоздаётся (это const из родителя)

Cascade effect: избегаем каскадных перестроек

// Плохо: всё перестраивается
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('Title'),
      elevation: 0,
      backgroundColor: Colors.white,
    ),
    body: Container(
      padding: EdgeInsets.all(16),
      child: Column(
        children: [
          Text('Item 1'),
          Text('Item 2'),
          Text('Item 3'),
        ],
      ),
    ),
  );
}

// Хорошо: только изменяемые части перестраиваются
const appBar = AppBar(
  title: Text('Title'),
  elevation: 0,
  backgroundColor: Colors.white,
);

const padding = EdgeInsets.all(16);
const items = [
  Text('Item 1'),
  Text('Item 2'),
  Text('Item 3'),
];

Widget build(BuildContext context) {
  return Scaffold(
    appBar: appBar, // const!
    body: Container(
      padding: padding, // const!
      child: Column(children: items), // const!
    ),
  );
}

Правило: const конструктор возможен, если все final поля

Все параметры конструктора либо final, либо const. Это гарантирует, что объект не изменится.

Лучшие практики

  • Делай const все StatelessWidget конструкторы
  • Выноси const значения из build() в поля класса
  • Используй const для Colors, EdgeInsets, TextStyle если они статичны
  • Лучше pass const через параметры, чем создавай новые объекты
  • Не забывай про const при создании виджетов (const MyWidget())

Когда const конструкторы используются везде, Flutter может применить множество оптимизаций, снизив нагрузку на GC и сделав приложение более плавным.