Terdapat dua jenis sintaks kaskade: .. dan ?..
Lakukan beberapa penugasan properti dan pemanggilan metode secara berurutan pada objek yang sama, menghilangkan variabel sementara dan membuat kode lebih lancar serta terhubung.
Sintaks kaskade bukan operator, melainkan gula sintaks khusus milik Dart.
1. Kaskade Biasa ..
Gunakan ketika objek pasti tidak bernilai null
Semua operasi .. berlaku pada objek asli di awal, nilai balik dari setiap metode diabaikan.
Contoh resmi
import 'dart:ui';
void main() {
// Penulisan dengan kaskade
var paint = Paint()
..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;
// Penulisan terpisah yang setara (tanpa kaskade, perlu ulangi nama variabel)
var paint2 = Paint();
paint2.color = Colors.black;
paint2.strokeCap = StrokeCap.round;
paint2.strokeWidth = 5.0;
}Code language: JavaScript (javascript)
Contoh ini mengimpor pustaka dart:ui milik Flutter, hanya bisa dipakai di proyek Flutter. Karena kita membahas Dart murni, cukup pahami sintaks di atas. Contoh selanjutnya menggunakan kelas bawaan Dart murni yaitu StringBuffer.
Kelas manipulasi string: StringBuffer
void main() {
// Sintaks kaskade
var sb = StringBuffer()
..write("Hello ")
..write("FoxDevelop.com ")
..writeln("Cascade");
print(sb.toString());
// Versi setara tanpa kaskade
var sb2 = StringBuffer();
sb2.write("Hello ");
sb2.write("FoxDevelop.com ");
sb2.writeln("Cascade");
print(sb2.toString());
}Code language: PHP (php)
Hasil eksekusi
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Hello FoxDevelop.com Cascade
Hello FoxDevelop.com CascadeCode language: CSS (css)
Sintaks di atas dipakai jika kamu yakin objek paint, sb, sb2 tidak akan pernah null: bisa menugaskan nilai dengan cepat tanpa mengulangi nama objek. Namun jika objek bernilai null, akan muncul error secara langsung.
void main() {
var sb = null
..write("Hello ")
..write("FoxDevelop.com ")
..writeln("Cascade");
print(sb.toString());
}Code language: JavaScript (javascript)

Oleh karena itu, tersedia cara penggunaan kedua seperti di bawah ini.
2. Kaskade Aman Null ?..
Jika objek bernilai null, seluruh rantai kaskade tidak akan dijalankan, sehingga menghindari error pointer null. Hanya bagian awal rantai pakai ?.., sisanya langsung pakai ...
void main() {
var sb = null
?..write("Hello ")
..write("FoxDevelop.com ")
..writeln("Cascade");
print(sb.toString());
}Code language: Dart (dart)
Perhatikan tanda tanya di depan ?..write(“Hello “)
Saat dikompilasi ulang, program berjalan normal
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
nullCode language: CSS (css)
Tidak ada error yang muncul
Berikut contoh resmi: pembaca cukup pahami bentuk sintaksnya saja.
// Mulai dengan ?.., setelahnya hanya pakai ..
document.querySelector('#confirm')
?..textContent = 'Confirm'
..classList.add('important')
..onClick.listen((e) => window.alert('Confirmed!'))
..scrollIntoView();
// Bentuk terpisah aman null yang setara
final button = document.querySelector('#confirm');
button?.textContent = 'Confirm';
button?.classList.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));
button?.scrollIntoView();Code language: JavaScript (javascript)
Kaskade Bersarang
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
// Kaskade terpisah untuk objek dalam PhoneNumberBuilder
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();Code language: PHP (php)
Properti phone adalah objek yang dibuat dengan pemanggilan PhoneNumberBuilder() lalu diberi nilai.
Catatan Penting
Kaskade hanya bisa diterapkan pada instansi objek; jika diletakkan setelah metode yang mengembalikan void, akan terjadi error kompilasi.
var sb = StringBuffer();
sb.write('foo') // write mengembalikan void
..write('bar'); // Error: tipe void tidak punya metode writeCode language: Dart (dart)
Di sini kita membuat objek StringBuffer bernama sb terlebih dahulu
Tetapi perintah diakhiri titik koma sebelum memanggil fungsi write dari objek sb, dan fungsi write mengembalikan void sehingga tidak bisa dirangkaikan dengan ..write selanjutnya, kecuali write mengembalikan instansi objek.
Cara penulisan yang benar
var sb = StringBuffer()
..write('foo')
..write('bar');Code language: Dart (dart)
Ringkasan
..setiap operasi akan kembali ke objek utama awal, tidak menerima nilai balik metode. Fungsinya mirip rantai metode di bahasa lain seperti JavaScript.?..adalah kaskade aman null untuk mencegah error ketika objek bernilai null. Hanya dipakai di awal rantai, jika bagian awal berhasil dijalankan berarti objek tidak null sehingga bagian berikut tidak perlu pakai ?..- Mendukung kaskade bersarang
- Tidak boleh menambahkan kaskade setelah metode yang mengembalikan tipe
void ..bukan operator, melainkan gula sintaks milik Dart
Apa itu gula sintaks?
Gula sintaks adalah singkatan ringkas yang disediakan bahasa pemrograman untuk logika dasar yang sama pada tahap analisis sintaks; tidak menambah kemampuan baru ke bahasa. Kompiler atau interpreter akan otomatis mengubah singkatan ini menjadi kode standar setara sebelum menghasilkan kode perantara.