dartlistspreadMenengah4 mnt baca

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)

dart
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:

dart
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:

dart
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:

dart
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

dart
// SALAH
void main() {
  List<String>? tambahan;
  // var menu = [...tambahan]; // ERROR: null
}
dart
// BENAR
void main() {
  List<String>? tambahan;
  var menu = [...?tambahan, 'nasi'];
  print(menu); // [nasi]
}

2. Mengira spread membuat salinan dalam (deep copy)

dart
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

dart
// SALAH: else tidak didukung di collection if
void main() {
  bool lapar = true;
  // var pesanan = [if (lapar) 'makan' else 'minum']; // ERROR
}
dart
// 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.

text
void main() {
  var wajib = ['beras', 'minyak'];
  bool adaPromo = true;
  // TODO: bangun belanja dengan spread + collection-if + collection-for
}