Pemrograman Dart
Percabangan: if-else, switch-case, dan Switch Expression Dart 3
Pelajari kontrol alur keputusan di Dart 3 menggunakan if-else, switch-case tanpa kewajiban break, serta fitur modern switch expression (=>) dan pattern matching.

Program komputer yang hanya berjalan lurus dari baris pertama hingga baris terakhir tidak akan mampu merespons situasi dunia nyata yang dinamis. Dalam aplikasi perbankan, misalnya, program harus memeriksa apakah saldo mencukupi sebelum mentransfer uang; dalam sistem akademik, nilai angka mahasiswa harus diterjemahkan menjadi indeks huruf A, B, C, atau D; dan pada aplikasi toko daring, tampilan status pesanan berubah sesuai tahapan pengiriman. Pengambilan keputusan bercabang ini diatur menggunakan struktur percabangan (control flow branching). Sejak hadirnya Dart 3, struktur percabangan menjadi jauh lebih ringkas dan ekspresif berkat dihapusnya kewajiban break pada switch serta hadirnya switch expression dan pattern matching.
Yang akan dipelajari
- Mengatur alur eksekusi program menggunakan
if,else if, danelsebeserta aturan kondisi bertipeboolmurni. - Menggunakan pernyataan
switch-casedi Dart 3 (tanpa perlu menulisbreakdi setiap akhircaseyang berisi kode). - Menggabungkan beberapa
caseyang memiliki aksi serupa. - Menulis Switch Expression (
=>) khas Dart 3 untuk menghasilkan nilai secara ringkas dan bersih. - Memanfaatkan pencocokan pola (pattern matching) relasional serta klausa penjaga (
when) di dalamswitch.
Percabangan dengan if, else if, dan else
Struktur if-else mengevaluasi kondisi dari atas ke bawah. Begitu satu kondisi bernilai true, blok kode di dalamnya akan dijalankan dan seluruh cabang else if atau else di bawahnya akan dilewati.
Satu aturan ketat di Dart yang membedakannya dari bahasa seperti JavaScript, C, atau Python: kondisi di dalam tanda kurung if (...) wajib bertipe bool (true atau false). Dart tidak mengenal konsep truthy/falsy otomatis seperti if (1) atau if (teks).
void main() {
int skorUjian = 84;
bool hadirUjian = true;
// Pemeriksaan berjenjang dengan if, else if, dan else
if (!hadirUjian) {
print('Status: Tidak Lulus (Tidak hadir saat ujian)');
} else if (skorUjian >= 85) {
print('Nilai Huruf: A (Sangat Istimewa)');
} else if (skorUjian >= 75) {
print('Nilai Huruf: B (Baik)');
} else if (skorUjian >= 60) {
print('Nilai Huruf: C (Cukup)');
} else {
print('Nilai Huruf: D (Perlu Perbaikan)');
}
}
// Output:
// Nilai Huruf: B (Baik)
Urutan penulisan kondisi sangat menentukan hasil! Pada kode di atas, kita memeriksa batas tertinggi (>= 85) terlebih dahulu, baru turun ke >= 75 dan >= 60. Jika urutannya dibalik (>= 60 ditaruh paling atas), maka nilai 84 maupun 95 akan langsung masuk ke cabang C karena keduanya memang lebih besar dari 60.
Pernyataan switch-case di Dart 3
Ketika kita memeriksa satu nilai terhadap banyak kemungkinan yang spesifik (seperti kode status pesanan, peran pengguna, atau nama hari), deretan if - else if sering terasa bertele-tele. Untuk situasi tersebut, gunakan switch-case.
Kabar gembira bagi pengguna Dart 3: Anda tidak perlu lagi menulis kata kunci break; di akhir setiap blok case yang tidak kosong! Di versi Dart lawas (maupun di bahasa C/Java), lupa menulis break akan menyebabkan eksekusi "bocor" (fall-through) ke case di bawahnya. Di Dart 3, setiap case yang memiliki pernyataan di dalamnya otomatis berhenti setelah selesai dijalankan.
Jika kita ingin beberapa nilai menjalankan blok kode yang sama, kita cukup menumpuk label case secara berurutan (kosong tanpa kode di antaranya) atau menggabungkannya dengan operator pola logika ||:
void main() {
String hari = 'Sabtu';
switch (hari) {
case 'Senin':
print('Awal pekan: Rapat koordinasi tim pukul 09.00.');
case 'Selasa':
case 'Rabu':
case 'Kamis':
// Tiga case di atas digabung karena menjalankan aksi yang sama
print('Hari kerja efektif: Fokus pengerjaan modul aplikasi.');
case 'Jumat':
print('Jumat: Evaluasi mingguan dan perapian dokumentasi.');
case 'Sabtu' || 'Minggu':
// Di Dart 3, kita juga bisa menggabungkan nilai case dengan '||'
print('Akhir pekan: Waktunya istirahat dan liburan!');
default:
print('Nama hari tidak dikenali.');
}
}
// Output:
// Akhir pekan: Waktunya istirahat dan liburan!
Perhatikan bagaimana cara menulis 'Sabtu' || 'Minggu' pada satu baris case di Dart 3 jauh lebih ringkas daripada menumpuk banyak baris case ke bawah. Cabang default: berfungsi layaknya else, yakni menangani semua nilai lain yang tidak cocok dengan daftar case di atasnya.
Switch Expression (=>) Khas Dart 3
Selain pernyataan switch biasa yang menjalankan perintah, Dart 3 memperkenalkan Switch Expression—sebuah fitur modern yang memungkinkan switch langsung mengembalikan nilai dan disimpan ke dalam variabel atau dikirim sebagai argumen fungsi!
Perbedaan sintaksnya sangat mudah dikenali:
- Tidak menggunakan kata kunci
case(langsung tuliskan polanya). - Menggunakan tanda panah (
=>) untuk memisahkan pola dan nilai kembaliannya. - Setiap cabang dipisahkan dengan tanda koma (
,). - Cabang penutup (
default) ditulis menggunakan simbol garis bawah (_).
| Fitur | switch Statement (Klasik) |
switch Expression (Dart 3) |
|---|---|---|
| Tujuan utama | Menjalankan serangkaian perintah/aksi | Menghasilkan sebuah nilai (ekspresi) |
| Kata kunci per cabang | case nilai: |
nilai => hasil, |
| Cabang penutup (fallback) | default: |
_ => nilaiDefault |
| Pemeriksaan kelengkapan (exhaustiveness) | Opsional | Wajib mencakup seluruh kemungkinan nilai |
Mari kita lihat betapa bersihnya switch expression ketika memetakan kode status pengiriman:
void main() {
String kodeStatus = 'DIKIRIM';
// Switch expression langsung menghasilkan nilai String
String deskripsiStatus = switch (kodeStatus) {
'MENUNGGU_BAYAR' => 'Silakan selesaikan pembayaran sebelum batas waktu.',
'DIPROSES' => 'Penjual sedang mengemas barang pesanan Anda.',
'DIKIRIM' => 'Paket sedang dibawa oleh kurir menuju alamat tujuan.',
'SELESAI' => 'Pesanan telah diterima. Terima kasih!',
'DIBATALKAN' => 'Pesanan ini telah dibatalkan.',
_ => 'Status pesanan tidak diketahui.',
};
print('Status [$kodeStatus]: $deskripsiStatus');
}
// Output:
// Status [DIKIRIM]: Paket sedang dibawa oleh kurir menuju alamat tujuan.
Pattern Matching dan Klausa when di Switch
Kekuatan terbesar switch di Dart 3 adalah kemampuannya mencocokkan pola (patterns), bukan sekadar kesamaan nilai konstan! Kita bisa menggunakan operator perbandingan (>=, <, &&) langsung di dalam cabang switch, bahkan menambahkan syarat tambahan menggunakan kata kunci when (guard clause).
void main() {
int totalBelanja = 250000;
bool memberVip = true;
// Menggunakan relational pattern (>=, <) dan guard clause (when)
double persentaseDiskon = switch (totalBelanja) {
>= 200000 when memberVip => 0.20, // Belanja >= 200rb DAN member VIP dapat 20%
>= 200000 => 0.10, // Belanja >= 200rb reguler dapat 10%
>= 100000 && < 200000 => 0.05, // Belanja 100rb - 199.999 dapat 5%
_ => 0.0, // Di bawah 100rb tidak dapat diskon
};
double nominalPotongan = totalBelanja * persentaseDiskon;
print('Total Belanja : Rp$totalBelanja (VIP: $memberVip)');
print('Diskon (${persentaseDiskon * 100}%) : Rp$nominalPotongan');
print('Total Bayar : Rp${totalBelanja - nominalPotongan}');
}
// Output:
// Total Belanja : Rp250000 (VIP: true)
// Diskon (20.0%) : Rp50000.0
// Total Bayar : Rp200000.0
Perhatikan dua baris pertama di dalam switch (totalBelanja) di atas: keduanya sama-sama mencocokkan pola >= 200000, tetapi baris pertama memiliki syarat pengawal when memberVip. Jika memberVip bernilai false, Dart otomatis turun ke baris berikutnya (>= 200000 => 0.10).
Coba sendiri
Buka dartpad.dev dan salin contoh kode Pattern Matching dan Klausa when di atas. Lakukan eksperimen berikut:
- Ubah
bool memberVip = true;menjadifalse, lalu tekan Run dan amati perubahan diskonnya dari20%menjadi10%. - Coba hapus baris terakhir
_ => 0.0,pada switch expression tersebut. Perhatikan pesan kesalahan kompilasi yang muncul: The type 'int' is not exhaustively matched by the switch cases. Ini membuktikan bahwa Dart 3 menjaga kita agar tidak pernah lupa menangani sisa kemungkinan nilai!
Kesalahan yang sering terjadi
| Kesalahan Pemula | Penyebab | Solusi yang Benar |
|---|---|---|
Menulis if (jumlahBarang) dengan asumsi angka selain 0 dianggap true |
Terbawa kebiasaan truthy/falsy dari bahasa JavaScript, Python, atau C. | Tuliskan perbandingan secara eksplisit hingga menghasilkan bool: if (jumlahBarang > 0). |
Urutan else if terbalik (memeriksa batas kecil dulu baru batas besar) |
Tidak menyadari bahwa if-else berhenti pada cabang pertama yang bernilai true. |
Saat memeriksa rentang nilai dengan >=, selalu urutkan dari angka terbesar ke terkecil. |
Lupa menambahkan cabang _ => ... pada switch expression untuk tipe int atau String |
Tipe int dan String memiliki kemungkinan nilai tak terbatas sehingga wajib memiliki cabang penutup (wildcard). |
Tambahkan _ => nilaiDefault di baris paling bawah switch expression. |
Menulis case dan titik dua (:) di dalam switch expression |
Mencampuradukkan sintaks switch statement klasik dengan switch expression Dart 3. |
Ingat: switch statement memakai case X: dan titik koma; switch expression memakai X => hasil, tanpa kata case. |
Kaitannya dengan Flutter / Dunia Nyata: Di Flutter, switch expression Dart 3 menjadi favorit para pengembang untuk memetakan state aplikasi atau kode status menjadi komponen visual secara langsung. Misalnya, menentukan warna lencana (badge) transaksi dengan
Color warnaStatus = switch (status) { 'LUNAS' => Colors.green, 'PENDING' => Colors.orange, _ => Colors.red };tanpa perlu membuat fungsi terpisah atau menumpuk operator ternary berlapis-lapis.
Latihan
Kerjakan tiga soal praktik berikut di DartPad untuk melatih logika percabangan Anda:
- Latihan 1 (Tarif Parkir Kendaraan dengan
if-else): Buatlah variabelint lamaParkirJam = 5;danbool karcisHilang = false;. Aturan tarif parkir mobil:- Jika
karcisHilangbernilaitrue, langsung dikenakan denda tetapRp50000(tanpa menghitung jam). - Jika tidak hilang dan
lamaParkirJam <= 0, cetak peringatan durasi tidak valid. - 2 jam pertama dikenakan tarif tetap
Rp5000. - Setiap jam berikutnya (di atas 2 jam) dikenakan tambahan
Rp3000per jam, namun tarif maksimal harian dibatasi paling banyakRp20000. Tampilkan total biaya parkirnya.
- Jika
- Latihan 2 (Konversi Kode HTTP dengan Switch Expression): Buat variabel
int statusCode = 404;. Gunakan Switch Expression Dart 3 untuk mengisi variabelString pesanServer:200atau201(gunakan pola200 || 201) menghasilkan'Berhasil memuat data'.400menghasilkan'Permintaan tidak valid (Bad Request)'.401atau403menghasilkan'Akses ditolak, silakan login kembali'.404menghasilkan'Data yang dicari tidak ditemukan'.>= 500 && < 600menghasilkan'Terjadi gangguan pada server pusat'.- Selain itu (
_) menghasilkan'Kode status tidak dikenali'.
- Latihan 3 (Indeks Kualitas Udara dengan Pattern &
when): Diketahui nilai indeks kualitas udaraint aqi = 125;danbool kelompokSensitif = true;. Gunakanswitchexpression dengan pola relasional dan klausawhenuntuk menentukan rekomendasi aktivitas:<= 50menghasilkan'Kualitas udara baik, bebas beraktivitas di luar.'<= 100menghasilkan'Kualitas udara sedang, aman untuk aktivitas normal.'<= 150 when kelompokSensitifmenghasilkan'Kurangi aktivitas berat di luar ruangan (Kelompok Sensitif).'<= 150menghasilkan'Masih cukup aman untuk masyarakat umum.'_menghasilkan'Udara tidak sehat! Gunakan masker di luar ruangan.'
Kunci jawaban dan pembahasan
Latihan 1
void main() {
int lamaParkirJam = 5;
bool karcisHilang = false;
int totalBiaya = 0;
if (karcisHilang) {
totalBiaya = 50000;
print('Karcis hilang! Dikenakan denda tetap: Rp$totalBiaya');
} else if (lamaParkirJam <= 0) {
print('Durasi parkir tidak valid.');
} else {
if (lamaParkirJam <= 2) {
totalBiaya = 5000;
} else {
totalBiaya = 5000 + ((lamaParkirJam - 2) * 3000);
// Batasi maksimal Rp20.000
if (totalBiaya > 20000) {
totalBiaya = 20000;
}
}
print('Lama Parkir : $lamaParkirJam jam');
print('Total Biaya : Rp$totalBiaya');
}
}
// Output:
// Lama Parkir : 5 jam
// Total Biaya : Rp14000
Pembahasan: Kita menempatkan pemeriksaan karcisHilang dan validasi lamaParkirJam <= 0 di urutan paling atas sebagai penyaring awal. Untuk durasi 5 jam, 2 jam pertama dihitung Rp5000 dan 3 jam sisanya 3 * 3000 = Rp9000, sehingga totalnya Rp14000 (masih di bawah batas maksimal Rp20000).
Latihan 2
void main() {
int statusCode = 404;
String pesanServer = switch (statusCode) {
200 || 201 => 'Berhasil memuat data',
400 => 'Permintaan tidak valid (Bad Request)',
401 || 403 => 'Akses ditolak, silakan login kembali',
404 => 'Data yang dicari tidak ditemukan',
>= 500 && < 600 => 'Terjadi gangguan pada server pusat',
_ => 'Kode status tidak dikenali',
};
print('HTTP $statusCode: $pesanServer');
}
// Output:
// HTTP 404: Data yang dicari tidak ditemukan
Pembahasan: Dengan switch expression Dart 3, kita dapat menggabungkan pencocokan nilai eksak (404), penggabungan beberapa nilai (200 || 201), sekaligus pencocokan rentang angka (>= 500 && < 600) dalam satu ekspresi yang sangat ringkas dan mudah dibaca.
Latihan 3
void main() {
int aqi = 125;
bool kelompokSensitif = true;
String rekomendasi = switch (aqi) {
<= 50 => 'Kualitas udara baik, bebas beraktivitas di luar.',
<= 100 => 'Kualitas udara sedang, aman untuk aktivitas normal.',
<= 150 when kelompokSensitif =>
'Kurangi aktivitas berat di luar ruangan (Kelompok Sensitif).',
<= 150 => 'Masih cukup aman untuk masyarakat umum.',
_ => 'Udara tidak sehat! Gunakan masker di luar ruangan.',
};
print('Indeks AQI : $aqi (Sensitif: $kelompokSensitif)');
print('Rekomendasi : $rekomendasi');
}
// Output:
// Indeks AQI : 125 (Sensitif: true)
// Rekomendasi : Kurangi aktivitas berat di luar ruangan (Kelompok Sensitif).
Pembahasan: Karena switch mengevaluasi pola dari atas ke bawah, nilai 125 melewati <= 50 dan <= 100, lalu cocok dengan pola <= 150 when kelompokSensitif karena kedua syarat terpenuhi. Seandainya kelompokSensitif bernilai false, barulah ia jatuh ke cabang <= 150 di bawahnya.
Discussion (0)
We store your optional name, your comment, and technical hashes (not your raw IP address) to prevent spam. A functional cookie lets you edit or delete your own comments from this browser. To request deletion, use the contact page.
No comments yet. Start the discussion.