Masukkan Password
29 Named Parameters in Dart | Dart named parameters | Dart Tutorial #28
Video ini membahas named parameters pada function Dart. Ini adalah konsep yang sangat penting dalam Dart dan Flutter, karena kamu akan sering sekali melihat syntax seperti:
Text(
"Hello",
textAlign: TextAlign.center,
)
atau:
Container(
width: 100,
height: 100,
)
textAlign, width, dan height adalah contoh penggunaan named parameters.
Kita bahas dari dasar supaya benar-benar jelas.
1. Ingat dulu positional parameter
Di materi sebelumnya kita belajar positional parameter.
Contohnya:
void test(int a, int b, int c) {
print("a = $a");
print("b = $b");
print("c = $c");
}
Pemanggilannya:
test(10, 20, 30);
Dart menentukan:
10 → a
20 → b
30 → c
Karena berdasarkan posisi.
Jadi:
argument pertama → parameter pertama
argument kedua → parameter kedua
argument ketiga → parameter ketiga
2. Masalah positional parameter
Bayangkan function mempunyai banyak parameter:
void registerUser(
String name,
String email,
String phone,
String address,
int age,
String gender,
String city,
String country,
) {
// ...
}
Kemudian kita memanggil:
registerUser(
"Budi",
"budi@gmail.com",
"08123456789",
"Jl. Mawar",
20,
"Male",
"Madiun",
"Indonesia",
);
Kita harus mengingat:
argument 1 → name
argument 2 → email
argument 3 → phone
argument 4 → address
...
Masalahnya adalah ketika melihat:
registerUser(
"Budi",
"budi@gmail.com",
"08123456789",
"Jl. Mawar",
20,
"Male",
"Madiun",
"Indonesia",
);
kita harus mengingat posisi setiap nilai.
Apalagi kalau parameter ada 10, 15, atau bahkan lebih.
3. Solusinya: named parameters
Dart menyediakan named parameters.
Syntax-nya menggunakan:
{}
Contoh:
void test({
int? a,
int? b,
int? c,
}) {
print("a = $a");
print("b = $b");
print("c = $c");
}
Perhatikan perbedaannya.
Positional:
void test(int a, int b, int c) {}
Named:
void test({
int? a,
int? b,
int? c,
}) {}
Yang membedakan adalah parameter named diletakkan di dalam:
{}
4. Cara memanggil named parameter
Ini bagian yang paling penting.
Kalau positional:
test(10, 20, 30);
Kalau named:
test(
a: 10,
b: 20,
c: 30,
);
Perhatikan syntax:
namaParameter: nilai
Jadi:
a: 10
berarti:
Berikan nilai
10kepada parameter bernamaa.
Begitu juga:
b: 20
artinya:
Berikan nilai
20kepada parameterb.
Dan:
c: 30
artinya:
Berikan nilai
30kepada parameterc.
5. Keuntungan terbesar: urutan tidak penting
Misalnya:
void test({
int? a,
int? b,
int? c,
}) {
print("a = $a");
print("b = $b");
print("c = $c");
}
Kita bisa memanggil:
test(
a: 10,
b: 20,
c: 30,
);
Hasil:
a = 10
b = 20
c = 30
Tetapi kita juga bisa:
test(
c: 30,
a: 10,
b: 20,
);
Tetap menghasilkan:
a = 10
b = 20
c = 30
Kenapa?
Karena Dart tidak lagi menggunakan posisi.
Dart menggunakan nama parameter.
6. Inilah perbedaan utama
Positional parameter
test(10, 20, 30);
Dart berpikir:
nilai pertama → a
nilai kedua → b
nilai ketiga → c
Named parameter
test(
c: 30,
a: 10,
b: 20,
);
Dart berpikir:
c: → 30
a: → 10
b: → 20
Jadi urutannya bebas.
7. Named parameter harus menggunakan nama
Ini penting.
Kalau function-nya:
void test({
int? a,
int? b,
int? c,
}) {}
Maka ini benar:
test(
a: 10,
b: 20,
c: 30,
);
Tetapi ini salah:
test(10, 20, 30);
Kenapa?
Karena ketiga parameter tersebut adalah named parameters, bukan positional parameters.
Dart mengharapkan:
a: nilai
b: nilai
c: nilai
bukan sekadar:
nilai
nilai
nilai
8. Kenapa menggunakan int??
Sekarang kita masuk ke null safety.
Misalnya:
void test({
int? a,
int? b,
int? c,
}) {}
Ketiga parameter tersebut nullable:
int?
Artinya mereka boleh mempunyai nilai:
10
20
30
atau:
null
Kenapa nullable?
Karena named parameter secara default adalah optional.
9. Named parameter secara default bersifat optional
Misalnya:
void test({
int? a,
int? b,
int? c,
}) {
print("a = $a");
print("b = $b");
print("c = $c");
}
Kita hanya memberikan b:
test(
b: 5,
);
Tidak masalah.
Hasil:
a = null
b = 5
c = null
Karena:
a → tidak diberikan → null
b → diberikan 5 → 5
c → tidak diberikan → null
10. Kita juga bebas memilih parameter mana yang ingin diberikan
Misalnya:
test(
c: 100,
);
Maka:
a = null
b = null
c = 100
Atau:
test(
a: 10,
c: 30,
);
Maka:
a = 10
b = null
c = 30
Tidak masalah.
Ini salah satu kelebihan named parameter.
11. Named parameter dan default value
Sekarang kita bisa memberikan default value.
Contoh:
void test({
int? a,
int? b,
int c = 0,
}) {
print("a = $a");
print("b = $b");
print("c = $c");
}
Perhatikan:
int c = 0
Artinya:
Kalau
ctidak diberikan, gunakan0.
12. Contoh default value
Kita panggil:
test(
a: 10,
b: 20,
);
Kita tidak memberikan c.
Maka:
a = 10
b = 20
c = 0
Kenapa c bukan null?
Karena kita sudah memberikan default:
c = 0
13. Kalau kita memberikan nilai c
Misalnya:
test(
a: 10,
b: 20,
c: 40,
);
Maka:
a = 10
b = 20
c = 40
Default value 0 tidak digunakan.
Jadi aturan sederhananya:
c diberikan?
│
├── Ya → gunakan nilai yang diberikan
│
└── Tidak → gunakan default value
14. Default value bisa diberikan ke parameter mana saja
Ini salah satu perbedaan penting dengan optional positional parameter.
Pada named parameter, kamu bebas memberikan default value pada parameter mana pun.
Contoh:
void test({
int a = 10,
int b = 20,
int c = 30,
}) {
print(a);
print(b);
print(c);
}
Kita bisa:
test();
Output:
10
20
30
Atau:
test(
b: 100,
);
Output:
10
100
30
Atau:
test(
c: 500,
a: 50,
);
Output:
50
20
500
Sangat fleksibel.
15. Sekarang masalah penting: bagaimana membuat named parameter menjadi wajib?
Tadi kita mengatakan:
Named parameter secara default adalah optional.
Tetapi bagaimana kalau kita ingin:
“Parameter ini harus diberikan!”
Misalnya:
void test({
int? a,
int? b,
int? c,
}) {}
Kita ingin b wajib.
Gunakan:
required
Sehingga:
void test({
int? a,
required int b,
int? c,
}) {
print("a = $a");
print("b = $b");
print("c = $c");
}
Sekarang:
a → optional
b → required
c → optional
16. Apa fungsi required?
required berarti:
Caller wajib memberikan nilai untuk named parameter tersebut.
Kalau kita melakukan:
test(
a: 10,
c: 30,
);
akan error karena:
b
belum diberikan.
Dart akan memberi tahu bahwa parameter b wajib diisi.
17. Cara yang benar
Karena b required:
test(
b: 20,
);
Ini sudah cukup.
a dan c boleh tidak diberikan.
Hasil:
a = null
b = 20
c = null
Kalau kita menulis:
test(
a: 10,
b: 20,
c: 30,
);
juga boleh.
Hasil:
a = 10
b = 20
c = 30
18. required bukan berarti harus diletakkan paling belakang
Ini perbedaan menarik dengan optional positional parameter.
Untuk named parameters, kita bisa:
void test({
int? a,
required int b,
int? c,
}) {}
Ini valid.
Tidak ada masalah bahwa c berada setelah b.
Karena semuanya adalah named parameter.
Kita bahkan bisa:
void test({
required int b,
int? a,
int? c,
}) {}
juga valid.
Urutan deklarasi named parameter tidak menentukan cara pemanggilan.
19. required + nullable
Ini konsep yang sering membingungkan pemula.
Lihat:
void test({
required int? b,
}) {}
Apa artinya?
required dan ? mempunyai fungsi yang berbeda.
required
Menentukan:
Apakah caller harus memberikan argument?
?
Menentukan:
Apakah nilai yang diberikan boleh
null?
Jadi:
required int? b
berarti:
Caller wajib menyebutkan
b, tetapi nilaibbolehnull.
Contoh:
test(b: 10);
boleh.
Dan:
test(b: null);
juga boleh.
Tetapi:
test();
tidak boleh, karena b required.
20. Bandingkan dengan required int
Kalau:
void test({
required int b,
}) {}
maka:
test(b: 10);
boleh.
Tetapi:
test(b: null);
tidak boleh.
Dan:
test();
juga tidak boleh.
Jadi:
required int
↓
harus diberikan
+
tidak boleh null
Sedangkan:
required int?
↓
harus diberikan
+
boleh null
21. required vs default value
Ada satu hal penting lagi.
Misalnya:
void test({
int c = 0,
}) {}
c optional.
Kalau tidak diberikan:
c = 0
Sedangkan:
void test({
required int c,
}) {}
c wajib.
Kalau tidak diberikan:
ERROR
Jadi:
| Syntax | Wajib? | Jika tidak diberikan |
|---|---|---|
int? c | ❌ | null |
int c = 0 | ❌ | 0 |
required int c | ✅ | Error |
required int? c | ✅ | Error jika tidak diberikan, tetapi nilai yang diberikan boleh null |
22. Contoh realistis: membuat user
Misalnya:
void createUser({
required String name,
required String email,
int age = 0,
}) {
print("Name: $name");
print("Email: $email");
print("Age: $age");
}
Di sini:
name → wajib
email → wajib
age → optional
default = 0
Kita bisa memanggil:
createUser(
name: "Budi",
email: "budi@gmail.com",
);
Output:
Name: Budi
Email: budi@gmail.com
Age: 0
Atau:
createUser(
email: "budi@gmail.com",
age: 20,
name: "Budi",
);
Tetap benar.
Kenapa?
Karena kita menggunakan nama parameter.
23. Inilah alasan named parameter sangat disukai di Flutter
Sekarang kamu akan mulai melihat kenapa Flutter sangat banyak menggunakan named parameter.
Contoh:
Container(
width: 100,
height: 100,
);
Kita langsung tahu:
width: 100
artinya ukuran width adalah 100.
Dan:
height: 100
artinya ukuran height adalah 100.
Bayangkan kalau semuanya positional:
Container(100, 100, ...);
Kita harus mengingat:
argument pertama = apa?
argument kedua = apa?
argument ketiga = apa?
Dengan named parameter, kode jauh lebih mudah dibaca.
24. Contoh lain di Flutter
Misalnya:
Text(
"Hello World",
textAlign: TextAlign.center,
);
Kita langsung bisa membaca:
textAlign → alignment text
TextAlign.center → nilainya
Atau:
Padding(
padding: EdgeInsets.all(16),
child: Text("Hello"),
);
Kita bisa langsung mengetahui:
padding → nilai padding
child → widget anak
Inilah salah satu alasan named parameters sangat penting ketika belajar Flutter.
25. Positional dan named bisa digunakan bersamaan
Ini juga sangat penting.
Kita bisa memiliki function seperti:
void user(
String name, {
required int age,
String? city,
}) {
print(name);
print(age);
print(city);
}
Di sini:
name → positional
age → named required
city → named optional
Pemanggilannya:
user(
"Budi",
age: 20,
);
Atau:
user(
"Budi",
age: 20,
city: "Madiun",
);
Jadi positional dan named bisa digunakan dalam satu function.
26. Perbedaan besar positional vs named
| Positional | Named |
|---|---|
Menggunakan () | Menggunakan {} |
| Berdasarkan posisi | Berdasarkan nama |
test(10, 20) | test(a: 10, b: 20) |
| Urutan penting | Urutan tidak penting |
Optional menggunakan [] | Optional secara default |
| Optional harus di belakang | Tidak ada aturan seperti itu |
| Bisa menggunakan default value pada optional | Bisa menggunakan default value |
Tidak bisa menggunakan required untuk positional biasa | Bisa menggunakan required |
27. Perhatikan syntax-nya
Ini perlu benar-benar kamu hafalkan.
Required positional
void test(int a, int b) {}
Pemanggilan:
test(10, 20);
Optional positional
void test(int a, [int? b]) {}
Pemanggilan:
test(10);
atau:
test(10, 20);
Named optional
void test({
int? a,
int? b,
}) {}
Pemanggilan:
test(
b: 20,
);
Named required
void test({
required int a,
required int b,
}) {}
Pemanggilan:
test(
a: 10,
b: 20,
);
28. Kesalahan penting dalam transcript
Ada beberapa bagian transcript yang perlu sedikit diluruskan.
Pertama: “semua named parameter nullable”
Video mengatakan kurang lebih bahwa semua named parameter optional, sehingga harus dibuat nullable.
Bagian ini tidak selalu benar.
Named parameter memang optional secara default, tetapi parameter tersebut tidak harus nullable.
Contoh ini valid:
void test({
int age = 0,
}) {}
age bukan nullable.
Jika tidak diberikan, dia mendapat 0.
Bahkan:
void test({
required int age,
}) {}
age juga bukan nullable dan wajib diberikan.
Jadi:
Optional tidak sama dengan nullable.
Ini konsep yang sangat penting.
29. Optional dan nullable adalah dua hal berbeda
Misalnya:
int? age
? membahas:
Apakah nilai boleh
null?
Sedangkan optional membahas:
Apakah parameter boleh tidak diberikan oleh caller?
Keduanya berbeda.
Contoh:
void test({
int? age,
}) {}
Artinya:
age boleh tidak diberikan
age boleh null
Sedangkan:
void test({
int age = 20,
}) {}
Artinya:
age boleh tidak diberikan
kalau tidak diberikan → 20
age tidak boleh null
Dan:
void test({
required int age,
}) {}
artinya:
age wajib diberikan
age tidak boleh null
30. Cara paling gampang mengingat named parameters
Bayangkan kamu memesan makanan.
Positional
Kamu mengatakan:
"Pizza", 2, "Pedas"
Orang yang menerima pesanan harus tahu:
urutan 1 = makanan
urutan 2 = jumlah
urutan 3 = level pedas
Named
Kamu mengatakan:
makanan: "Pizza"
jumlah: 2
levelPedas: "Pedas"
Jauh lebih jelas.
Dan kamu bisa menulis:
levelPedas: "Pedas"
jumlah: 2
makanan: "Pizza"
Tetap bisa dipahami karena setiap nilai mempunyai nama.
31. Cheat sheet
Kalau kamu melihat:
void test(
int a,
int b, [
int? c,
]) {}
bacanya:
a = positional wajib
b = positional wajib
c = positional optional
Kalau melihat:
void test({
int? a,
int? b,
}) {}
bacanya:
a = named optional
b = named optional
Kalau:
void test({
required int a,
required int b,
}) {}
bacanya:
a = named wajib
b = named wajib
Kalau:
void test({
int a = 10,
int b = 20,
}) {}
bacanya:
a = named optional, default 10
b = named optional, default 20
32. Empat bentuk yang wajib kamu pahami
Ini menurut saya bagian paling penting dari materi ini.
① Required positional
void test(int a) {}
test(10);
② Optional positional
void test([int? a]) {}
test();
atau:
test(10);
③ Optional named
void test({
int? a,
}) {}
test();
atau:
test(a: 10);
④ Required named
void test({
required int a,
}) {}
test(a: 10);
Tidak boleh:
test();
Kesimpulan
Inti dari video ini adalah named parameter membuat function lebih mudah dibaca dan lebih fleksibel.
Positional:
test(10, 20, 30);
Kita harus mengingat:
10 → a
20 → b
30 → c
Sedangkan named:
test(
c: 30,
a: 10,
b: 20,
);
Kita tidak perlu mengingat urutan karena nama parameter sudah menjelaskan nilai tersebut untuk siapa.
Dan ada tiga bentuk named parameter yang penting:
// Optional, boleh null
void test({int? a}) {}
// Optional, punya default value
void test({int a = 0}) {}
// Required, wajib diberikan
void test({required int a}) {}
Kalimat yang paling penting untuk kamu ingat:
Positional parameter menggunakan posisi untuk menentukan nilai, sedangkan named parameter menggunakan nama parameter. Named parameter secara default optional, dan
requireddigunakan kalau kita ingin membuat named parameter menjadi wajib.
Kalau kamu sudah memahami positional vs named + optional vs required + default value, kamu sudah memegang salah satu fondasi penting dalam membaca kode Flutter.