Primary Constructors (основные конструкторы)

Разбор понятия

Минимальная требуемая версия Dart: 3.13.

Назначение: Одной строкой в начале класса одновременно объявить поля + основной конструктор, что значительно сокращает шаблонный код. Поведение во время выполнения полностью совпадает с обычными конструкторами, меняется только синтаксис.

  1. Declaring parameters (объявляющие параметры): Параметры в заголовке класса с ключевым словом var / final автоматически создают экземплярные поля с совпадающим именем.
  2. Non-declaring parameters (обычные параметры): Параметры без var/final — это лишь входные аргументы конструктора, отдельные поля класса не создаются.
  3. In-body constructors (внутренние конструкторы класса): Именованные, фабричные и перенаправляющие конструкторы, прописанные внутри фигурных скобок класса.
  4. Обязательное правило: Класс с основным конструктором не может содержать другие генеративные конструкторы, кроме перенаправляющих. Это гарантирует, что все экземпляры создаются строго через основной конструктор.

Сравнение старого синтаксиса и сокращенной записи основного конструктора

// Длинный традиционный синтаксис
class Point {
  int x;
  int y;
  Point(this.x, this.y);
}

// Сокращенная запись основного конструктора
class Point(var int x, var int y);Code language: JavaScript (javascript)

Правила автоматического создания полей

1. С ключевыми словами var / final

Автоматически создаются экземплярные поля.

Переменные полей пишутся прямо в скобках после имени класса.

// x и y автоматически становятся членами класса
class Point(var int x, final int y);

void main() {
  final p = Point(10, 20);
  print(p.x); // 10
  print(p.y); // 20
  // p.y = 30; // Ошибка: y помечен как final, изменять нельзя
}Code language: JavaScript (javascript)

При запуске данного кода появится ошибка.

D:\dartdemo\firstdart\bin>dart run
Building package executable...
Failed to build firstdart:firstdart:
firstdart.dart:2:13: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);
            ^^^
firstdart.dart:2:12: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);
           ^
firstdart.dart:2:36: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);Code language: JavaScript (javascript)

Причина ошибки: Сокращенный синтаксис class Point(var int x, final int y); под названием Primary Constructors (основные конструкторы) — это экспериментальная возможность Dart. В стабильной версии она отключена по умолчанию, поэтому прямой запуск выдаст синтаксическую ошибку.

Текущая дата: 10 июля 2026 года, 14:55. Возможно, к моменту прочтения статьи выйдет новая стабильная версия Dart, где данный синтаксис будет поддерживаться из коробки.

Для временного тестирования используйте команду:

dart run --enable-experiment=primary-constructors

2. Без var / final

Параметры носят временный характер, отдельные поля не создаются.

class User(String name) {
  // print(name); // К параметру можно обратиться внутри класса, но поле this.name не создаётся
  final String msg = "Hi $name"; // Ошибка компиляции
}

void main() {
  final u = User("Tom");
  // print(u.name); // Ошибка компиляции: поля name не существует
}Code language: JavaScript (javascript)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *