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

Когда лучше использовать const?

1.0 Junior🔥 181 комментариев
#Dart

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

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

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

Использование const в Dart/Flutter

const — это ключевое слово в Dart, которое создаёт compile-time константы. Это критически важно для производительности Flutter приложений, особенно при работе с виджетами.

Основные преимущества const

1. Оптимизация памяти

Когда вы используете const, Dart гарантирует, что один и тот же объект будет переиспользован везде в коде. Это означает, что вместо создания нескольких экземпляров одного и того же значения, используется одна ссылка в памяти.

const x = 42;
const y = 42;
// x и y указывают на одну и ту же ячейку памяти

2. Оптимизация виджетов в Flutter

В Flutter const для виджетов особенно важен. При использовании const на виджет, Flutter знает, что этот виджет никогда не изменится, и может пропустить его при rebuild. Это критически влияет на производительность:

// ❌ Плохо — виджет пересчитывается каждый раз
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text("Hello"),
    );
  }
}

// ✅ Хорошо — виджет не пересчитывается
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return const Container(
      child: Text("Hello"),
    );
  }
}

3. Время компиляции vs Runtime

const вычисляется во время компиляции, что означает:

  • Ошибки выявляются раньше (на этапе компиляции)
  • Нет переваров на вычисления во время выполнения
  • Меньший размер бинарника
const int x = 10; // OK — выражение вычислимо при компиляции
const int y = int.parse("10"); // Ошибка — функция вызывается во время runtime

Когда использовать const

✅ ИСПОЛЬЗУЙ const для:

  1. Неизменяемых значений

    const String appName = "My App";
    const int maxAttempts = 3;
    const List<String> cities = ["Moscow", "SPB", "Kazan"];
    
  2. Неизменяемых объектов (если все поля final)

    class Config {
      final String apiUrl;
      final int timeout;
      
      const Config(this.apiUrl, this.timeout);
    }
    
    const config = Config("https://api.com", 30);
    
  3. Всех виджетов, у которых все дети const

    @override
    Widget build(BuildContext context) {
      return const Scaffold(
        appBar: AppBar(title: Text("Home")),
        body: Center(child: Text("Hello")),
      );
    }
    
  4. Коллекций и значений, которые не меняются

    const defaultColors = {
      "primary": Color(0xFF6200EE),
      "secondary": Color(0xFF03DAC6),
    };
    

❌ НЕ ИСПОЛЬЗУЙ const для:

  1. Значений, которые вычисляются от других переменных

    int x = 10;
    const int y = x + 5; // ❌ Ошибка
    final int y = x + 5; // ✅ Правильно
    
  2. Экземпляров изменяемых классов

    const List<int> list = [1, 2, 3]; // ✅ Сама коллекция const
    const Map<String, int> map = {}; // ✅ Сама коллекция const
    
  3. Виджетов с изменяемыми дочерними элементами

    String title = "Dynamic";
    return const Text(title); // ❌ Ошибка — title изменяется
    

Разница между const и final

// const — compile-time constant
const x = 42; // Вычисляется при компиляции

// final — runtime constant (может быть вычислена при runtime)
final DateTime now = DateTime.now(); // Значение устанавливается при выполнении

// var может меняться
var counter = 0;
counter = 1; // OK

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

  1. Всегда добавляй const для неизменяемых виджетов — это одна из самых важных оптимизаций в Flutter
  2. Используй const для глобальных констант вместо magic numbers
  3. Включи linting (always_put_control_body_on_new_line, prefer_const_constructors) для автоматического напоминания о const
  4. Изучи вывод типов — const работает лучше всего со строгой типизацией

Правильное использование const может значительно улучшить производительность Flutter приложения, особенно для сложных UI с большим количеством виджетов.

Когда лучше использовать const? | PrepBro