Konzept verstehen
Mindest erforderliche Dart-Sprachversion: 3.13.
Zweck: In einer Zeile am Anfang der Klasse gleichzeitig Felder + Hauptkonstruktor deklarieren, dadurch Boilerplate-Code stark reduzieren. Das Laufzeitverhalten ist identisch mit herkömmlichen Konstruktoren, lediglich die Syntax wurde vereinfacht.
- Declaring parameters (deklarierende Parameter) : Parameter am Klassenanfang mit
var/finalerzeugen automatisch Instanzfelder mit gleichem Namen. - Non-declaring parameters (einfache Parameter) : Parameter ohne
var/finalsind nur Eingabewerte des Konstruktors und erzeugen keine Klassenfelder. - In-body constructors (innen liegende Konstruktoren) : Benannte, Fabrik- oder umleitende Konstruktoren, die innerhalb der geschweiften Klammern der Klasse stehen.
- Zwingende Regel: Eine Klasse mit Hauptkonstruktor darf keine weiteren nicht umleitenden generativen Konstruktoren besitzen, damit alle Instanzen zwingend den Hauptkonstruktor durchlaufen.
Vergleich herkömmliche Syntax vs. Kurzform des Hauptkonstruktors
// Herkömmliche ausführliche Schreibweise
class Point {
int x;
int y;
Point(this.x, this.y);
}
// Kurzform mit Hauptkonstruktor
class Point(var int x, var int y);Code-Sprache: JavaScript (javascript)
Regeln zur automatischen Felderzeugung
1. Mit var / final
Es werden automatisch Instanzfelder erstellt.
Schreiben Sie die Feldvariablen direkt in die Klammern nach dem Klassennamen.
// x und y werden automatisch zu Mitgliedsvariablen der Klasse
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; // Fehler: y ist mit final deklariert
}Code-Sprache: JavaScript (javascript)
Beim Ausführen des obigen Codes tritt ein Fehler auf.
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-Sprache: JavaScript (javascript)
Ursache: Die Kurzschreibweise class Point(var int x, final int y); mit dem Namen Primary Constructors (Hauptkonstruktoren) ist eine experimentelle Funktion von Dart. In der aktuellen stabilen Dart-Version ist sie standardmäßig deaktiviert, daher tritt bei direktem Ausführen ein Syntaxfehler auf.
Aktueller Termin: 10. Juli 2026, 14:55 Uhr. Zum Zeitpunkt der Lektüre dieses Artikels hat Dart möglicherweise eine neue offizielle Version veröffentlicht, die diese Syntax standardmäßig unterstützt.
Verwenden Sie diesen Befehl zum temporären Testen:
dart run --enable-experiment=primary-constructors

2. Ohne var / final
Nur temporäre Parameter, es werden keine Felder erzeugt.
class User(String name) {
// print(name); // Auf den Parameter kann innerhalb der Klasse direkt zugegriffen werden, aber es entsteht kein Feld this.name
final String msg = "Hi $name"; // Kompilierfehler
}
void main() {
final u = User("Tom");
// print(u.name); // Kompilierfehler: Feld name existiert nicht
}Code-Sprache: JavaScript (javascript)