Parameter Named & Optional
Parameter opsional positional, named, required, dan default value.
Parameter yang fleksibel
Fungsi dasar selalu butuh semua argumen dalam urutan tepat. Tapi dunia nyata tidak sekaku itu: saat memesan kopi kamu cukup bilang "kopi susu", tanpa menyebut gula, es, dan ukuran setiap kali karena ada nilai default. Dart menyediakan tiga jenis parameter fleksibel: optional positional, named, dan default value.
Analogi: parameter biasa itu seperti formulir wajib isi semua kolom berurutan. Named parameter itu seperti memesan lewat aplikasi: kamu pilih kolom mana yang diisi, urutannya bebas, dan yang tidak dipilih pakai nilai standar.
Kenapa parameter fleksibel ada?
Karena fungsi dengan banyak parameter jadi mimpi buruk kalau semuanya wajib dan positional. Bayangkan buatUser(nama, umur, kota, pekerjaan, hobi, ...) dengan 8 argumen berurutan, salah urut sedikit langsung bug. Named parameter membuat pemanggilan jelas: buatUser(nama: 'Budi', kota: 'Jakarta').
Optional positional: boleh dikosongkan
Bungkus parameter dengan kurung siku []:
String sapa(String nama, [String? sapaan]) {
if (sapaan != null) {
return '$sapaan, $nama!';
}
return 'Halo, $nama!';
}
void main() {
print(sapa('Budi')); // Halo, Budi!
print(sapa('Ani', 'Selamat pagi')); // Selamat pagi, Ani!
}Parameter opsional bertipe nullable (String?) karena saat tidak diisi nilainya null. Ia tetap positional: kalau diisi, harus sesuai urutan.
Named parameter: panggil dengan nama
Bungkus dengan kurung kurawal {}, panggil dengan nama::
String buatProfil({required String nama, int umur = 0, String kota = 'Jakarta'}) {
return '$nama, $umur tahun, tinggal di $kota';
}
void main() {
print(buatProfil(nama: 'Budi'));
// Budi, 0 tahun, tinggal di Jakarta
print(buatProfil(nama: 'Ani', umur: 25, kota: 'Bandung'));
// Ani, 25 tahun, tinggal di Bandung
// Urutan bebas!
print(buatProfil(kota: 'Surabaya', nama: 'Cici', umur: 30));
}Tiga kata kunci penting:
required: wajib diisi pemanggil, tidak boleh absen.- Nilai default (
= 0,= 'Jakarta'): dipakai kalau pemanggil tidak mengisi. - Tanpa keduanya, parameter menjadi nullable opsional.
Contoh kedua, pola yang sangat umum di Flutter:
void tampilkanKartu({required String judul, String isi = '-', bool penting = false}) {
var tanda = penting ? '[PENTING] ' : '';
print('$tanda$judul: $isi');
}
void main() {
tampilkanKartu(judul: 'Tugas');
tampilkanKartu(judul: 'Ujian', isi: 'Besok jam 8', penting: true);
}Perhatikan betapa jelasnya pemanggilan kedua dibanding versi positional tampilkanKartu('Ujian', 'Besok jam 8', true) yang memaksa pembaca menebak arti true.
Kesalahan umum pemula
1. Named parameter tanpa nama saat memanggil
// SALAH
String buatProfil({required String nama}) => nama;
void main() {
// print(buatProfil('Budi')); // ERROR: harus pakai nama:
}// BENAR
void main() {
print(buatProfil(nama: 'Budi'));
}2. Lupa required lalu kaget dapat null
// SALAH: nama bisa null tanpa disadari
String sapa({String? nama}) => 'Halo, $nama';
void main() {
print(sapa()); // Halo, null <- jelek!
}// BENAR: tandai required kalau memang wajib
String sapa({required String nama}) => 'Halo, $nama';
void main() {
print(sapa(nama: 'Budi')); // Halo, Budi
}3. Mencampur positional setelah optional
// SALAH: parameter wajib tidak boleh setelah opsional
// void contoh([String? a], String b) {} // ERROR// BENAR: yang wajib dulu, baru opsional
void contoh(String b, [String? a]) {
print('$b $a');
}Kesimpulan
Optional positional [] untuk 1-2 parameter tambahan yang jarang dipakai, named {} untuk fungsi dengan banyak opsi agar pemanggilan jelas. Di Flutter, named parameter dengan required adalah pola sehari-hari untuk widget.
Catatan teknis: Named parameter tanpa
requireddan tanpa default menjadi nullable. Ini salah satu tempat null safety Dart paling terasa: compiler memaksamu memutuskan sejak awal mana yang wajib dan mana yang boleh kosong.
Tantangan
Fungsi profil fleksibel
Buat fungsi profil dengan named parameter: nama (required), kota (default "Jakarta"), umur (optional). Cetak kalimat profil. Panggil 3x dengan variasi berbeda.
// TODO: fungsi profil
void main() {
// TODO: 3 panggilan berbeda
}