Разбор понятия
Минимальная требуемая версия Dart: 3.13.
Назначение: Одной строкой в начале класса одновременно объявить поля + основной конструктор, что значительно сокращает шаблонный код. Поведение во время выполнения полностью совпадает с обычными конструкторами, меняется только синтаксис.
- Declaring parameters (объявляющие параметры): Параметры в заголовке класса с ключевым словом
var/finalавтоматически создают экземплярные поля с совпадающим именем. - Non-declaring parameters (обычные параметры): Параметры без
var/final— это лишь входные аргументы конструктора, отдельные поля класса не создаются. - In-body constructors (внутренние конструкторы класса): Именованные, фабричные и перенаправляющие конструкторы, прописанные внутри фигурных скобок класса.
- Обязательное правило: Класс с основным конструктором не может содержать другие генеративные конструкторы, кроме перенаправляющих. Это гарантирует, что все экземпляры создаются строго через основной конструктор.
Сравнение старого синтаксиса и сокращенной записи основного конструктора
// Длинный традиционный синтаксис
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)