Spread & Collection-if/for
Menggabung list dengan ..., dan membangun list kondisional.
Menggabung list dengan elegan
Sering kamu perlu menggabung dua list, atau menyisipkan banyak elemen sekaligus. Cara kuno memakai addAll berkali-kali, tapi Dart punya sintaks khusus yang jauh lebih ekspresif: spread operator (...) dan collection if/for.
Analogi: spread itu seperti menuangkan isi satu kantong ke kantong lain sekaligus, bukan memindahkan permen satu per satu.
Kenapa spread ada?
Karena penggabungan list adalah operasi super umum: menggabung hasil dua API, menambah header ke daftar, membuat salinan. Spread membuat niatnya terlihat langsung di dalam literal list.
Spread: ... (tiga titik)
void main() {
var buahLokal = ['mangga', 'pisang'];
var buahImpor = ['apel', 'anggur'];
// Gabungkan keduanya
var semua = [...buahLokal, ...buahImpor];
print(semua); // [mangga, pisang, apel, anggur]
// Sisipkan di tengah literal
var menu = ['nasi', ...buahLokal, 'lauk'];
print(menu); // [nasi, mangga, pisang, lauk]
}...buahLokal artinya "hamparkan semua elemen buahLokal di sini". List asli tidak berubah, yang terbentuk adalah list baru.
Contoh kedua, spread dengan null safety:
void main() {
List<String>? tambahan; // bisa null!
// ...? aman walau list-nya null
var menu = ['nasi', ...?tambahan, 'lauk'];
print(menu); // [nasi, lauk], tidak error
tambahan = ['sayur', 'sambal'];
var menu2 = ['nasi', ...?tambahan, 'lauk'];
print(menu2); // [nasi, sayur, sambal, lauk]
}...? (null-aware spread) melewati list yang null tanpa error. Tanpa tanda tanya, spread list null akan crash.
Collection if: logika di dalam literal
Kamu bisa menaruh if langsung di dalam pembuatan list:
void main() {
bool lapar = true;
bool haus = false;
var pesanan = [
'nasi',
if (lapar) 'lauk ekstra',
if (haus) 'es teh',
];
print(pesanan); // [nasi, lauk ekstra]
}Ini jauh lebih rapi daripada membuat list kosong lalu add bersyarat satu per satu. Pola ini sangat populer di Flutter untuk membangun daftar widget bersyarat.
Collection for: loop di dalam literal
Begitu juga dengan for:
void main() {
var angka = [1, 2, 3];
var kuadrat = [for (var n in angka) n * n];
print(kuadrat); // [1, 4, 9]
// Kombinasi for + if
var genapKuadrat = [for (var n in angka) if (n % 2 == 0) n * n];
print(genapKuadrat); // [4]
}Satu baris menggantikan loop manual + list kosong + add. Setelah terbiasa, kamu akan jarang menulis loop manual untuk transformasi sederhana.
Kesalahan umum
1. Spread list null tanpa tanda tanya
// SALAH
void main() {
List<String>? tambahan;
// var menu = [...tambahan]; // ERROR: null
}// BENAR
void main() {
List<String>? tambahan;
var menu = [...?tambahan, 'nasi'];
print(menu); // [nasi]
}2. Mengira spread membuat salinan dalam (deep copy)
void main() {
var asli = [
[1, 2],
[3, 4]
];
var salinan = [...asli];
salinan[0].add(99);
print(asli); // [[1, 2, 99], [3, 4]] <- ikut berubah!
}Spread menyalin referensi elemen, bukan mengkloning isinya (shallow copy). Untuk list of list, elemen dalamnya masih berbagi objek yang sama.
3. Collection if dengan else yang salah tempat
// SALAH: else tidak didukung di collection if
void main() {
bool lapar = true;
// var pesanan = [if (lapar) 'makan' else 'minum']; // ERROR
}// BENAR: pakai ternary untuk dua pilihan
void main() {
bool lapar = true;
var pesanan = [lapar ? 'makan' : 'minum'];
print(pesanan); // [makan]
}Kesimpulan
... menghamparkan list, ...? versi aman-null, collection if/for menaruh logika di dalam literal. Tiga fitur ini membuat manipulasi list di Dart terasa modern dan ringkas, dan semuanya dipakai intensif di Flutter.
Catatan teknis: Spread juga bekerja untuk Set (
{...a, ...b}) dan Map ({...a, ...b}, dengan key duplikat ditimpa yang terakhir). Satu sintaks, tiga koleksi.
Tantangan
Daftar belanja dinamis
Buat list wajib = ['beras', 'minyak']. Bangun belanja = wajib + (jika adaPromo tambah 'kopi gratis') + (untuk i 1..3 tambah 'snack-$i'). Cetak hasilnya.
void main() {
var wajib = ['beras', 'minyak'];
bool adaPromo = true;
// TODO: bangun belanja dengan spread + collection-if + collection-for
}