Es gibt zwei Varianten der Kaskaden-Syntax: .. und ?..
Mehrfache Eigenschaftszuweisungen und Methodenaufrufe nacheinander auf dasselbe Objekt ausführen, temporäre Variablen entfallen und der Code flüssiger lesbar wird.
Die Kaskaden-Syntax ist kein Operator, sondern Dart-spezifischer Syntaxzucker.
1. Normale Kaskade ..
Nutzen, wenn das Objekt garantiert nicht null ist
Jede ..-Operation bezieht sich auf das ursprüngliche Startobjekt, Rückgabewerte einzelner Methoden werden ignoriert.
Offizielles Beispiel
import 'dart:ui';
void main() {
// Kaskaden-Schreibweise
var paint = Paint()
..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;
// Äquivalente aufgeteilte Schreibweise (ohne Kaskade, Variablenname wiederholen)
var paint2 = Paint();
paint2.color = Colors.black;
paint2.strokeCap = StrokeCap.round;
paint2.strokeWidth = 5.0;
}Code-Sprache: JavaScript (javascript)
Dieses Beispiel bindet die Flutter-spezifische Bibliothek dart:ui ein und funktioniert nur innerhalb von Flutter-Projekten. Für das Verständnis der reinen Dart-Syntax reicht es, die obige Struktur zu erfassen. Das nächste Beispiel nutzt die reine Dart-Standardklasse StringBuffer.
Stringverarbeitungs-Klasse: StringBuffer
void main() {
// Kaskaden-Syntax
var sb = StringBuffer()
..write("Hello ")
..write("FoxDevelop.com ")
..writeln("Cascade");
print(sb.toString());
// Äquivalent ohne Kaskade
var sb2 = StringBuffer();
sb2.write("Hello ");
sb2.write("FoxDevelop.com ");
sb2.writeln("Cascade");
print(sb2.toString());
}Code-Sprache: PHP (php)
Ausgabeergebnis
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Hello FoxDevelop.com Cascade
Hello FoxDevelop.com CascadeCode-Sprache: CSS (css)
Die oben gezeigte Vorgehensweise funktioniert, wenn Sie sicher sind, dass Objekte wie paint, sb oder sb2 niemals null sind: Schnelle Zuweisungen ohne wiederholtes Nennen des Objektnamens. Ist das Objekt jedoch null, folgt direkt ein Laufzeitfehler.
void main() {
var sb = null
..write("Hello ")
..write("FoxDevelop.com ")
..writeln("Cascade");
print(sb.toString());
}Code-Sprache: JavaScript (javascript)

Dafür gibt es die zweite unten vorgestellte Schreibweise.
2. Null-sichere Kaskade ?..
Ist das Objekt null, wird die gesamte Kaskadenkette nicht ausgeführt, um Nullpointer-Fehler zu vermeiden. Nur der erste Kettenteil nutzt ?.., alle folgenden Teile verwenden direkt ...
void main() {
var sb = null
?..write("Hello ")
..write("FoxDevelop.com ")
..writeln("Cascade");
print(sb.toString());
}Code-Sprache: Dart (dart)
Achten Sie auf das Fragezeichen vor ?..write(„Hello „)
Beim erneuten Kompilieren läuft das Programm fehlerfrei
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
nullCode-Sprache: CSS (css)
Es treten keine Fehler auf
Nachfolgend das offizielle Beispiel – es genügt, die Syntaxform zu verstehen.
// Beginne mit ?.., danach nur ..
document.querySelector('#confirm')
?..textContent = 'Confirm'
..classList.add('important')
..onClick.listen((e) => window.alert('Confirmed!'))
..scrollIntoView();
// Äquivalente aufgeteilte null-sichere Schreibweise
final button = document.querySelector('#confirm');
button?.textContent = 'Confirm';
button?.classList.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));
button?.scrollIntoView();Code-Sprache: JavaScript (javascript)
Verschachtelte Kaskaden
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
// Separate Kaskade für das innere PhoneNumberBuilder-Objekt
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();Code-Sprache: PHP (php)
phone ist ein Objekt, das mit PhoneNumberBuilder() instanziiert und mit Werten befüllt wird.
Wichtige Hinweise
Kaskaden funktionieren nur mit Objektinstanzen; folgen sie auf eine Methode mit Rückgabetyp void, entsteht ein Kompilierfehler.
var sb = StringBuffer();
sb.write('foo') // write gibt void zurück
..write('bar'); // Fehler: void-Typ hat keine write-MethodeCode-Sprache: Dart (dart)
Hier wurde zunächst ein StringBuffer-Objekt mit Namen sb erstellt
Aber die Anweisung endet mit einem Semikolon, bevor write über sb aufgerufen wird. Da write void zurückgibt, lässt sich kein weiteres ..write anhängen – nur wenn write eine Objektinstanz zurückliefert, ist eine Verkettung erlaubt.
Korrekte Schreibweise
var sb = StringBuffer()
..write('foo')
..write('bar');Code-Sprache: Dart (dart)
Zusammenfassung
..kehrt bei jeder Operation zum ursprünglichen Top-Objekt zurück und ignoriert Methodenrückgabewerte. Das entspricht dem Method-Chaining aus anderen Sprachen wie JavaScript.?..ist die null-sichere Kaskade zur Vermeidung von Fehlern bei null-Objekten. Es wird nur am Anfang der Kette verwendet; läuft der erste Teil erfolgreich, ist das Objekt nicht null, also entfällt ?.. für alle nachfolgenden Teile.- Verschachtelte Kaskaden werden unterstützt
- Hinter Methoden mit Rückgabetyp
voiddürfen keine Kaskaden platziert werden ..ist kein Operator, sondern Syntaxzucker von Dart
Was ist Syntaxzucker?
Syntaxzucker ist eine kompakte Kurzschreibweise in Programmiersprachen für identische zugrundeliegende Logik während der Syntaxanalyse; sie erweitert keine Sprachfunktionen. Compiler oder Interpreter wandeln diese Kurzschreibweise automatisch in äquivalenten Standardcode um, bevor Zwischencode generiert wird.