} -->
Fungsi adalah blok kode yang melakukan tugas tertentu dan bisa dipanggil berkali-kali. Dart mendukung berbagai jenis fungsi dengan fitur modern.
void: Menandakan fungsi tidak mengembalikan nilai.
void main() {
basicFunc();
}
void basicFunc() {
print('Hello salam kenal');
}
a. positional parameter
void main() {
positionalParameter('Ubay', 'Frontend Engineer');
}
void positionalParameter(String name, String job) {
print('Nama saya $name, pekerjaan saya $job');
}
b. optional parameter
void main() {
optionalParameter('Ubay');
}
void optionalParameter(String name, [String hobi = 'gak punya hobi']) {
print('Nama saya $name, hobi saya $hobi');
}
c. named parameter
void main() {
namedParameter(name: 'Ubay', umur: 20);
}
void namedParameter({required String name, int? umur}) {
print("Nama saya $name, umur saya ${umur ?? 0}");
}
void main() {
print(fungsiWithReturn());
}
String fungsiWithReturn() {
return 'Hallo saya ubay';
}
void main() {
print(fungsiWithReturn2(10, 40));
}
int fungsiWithReturn2(int a, int b) => a + b;
void main() {
// simpan fungsi ke variabel
var tampungFirstClassFunction = firstClassFunction;
tampungFirstClassFunction('Hello ini first class function');
}
void firstClassFunction(String msg) => print(msg.toUpperCase());
void main() {
nums.forEach((num) => print("anonymous func = $num"));
}
List<int> nums = [1, 2, 3, 4];
Lexical Closures adalah fungsi yang bisa mengingat dan mengakses variabel dari scope tempat ia dibuat, meskipun scope tersebut sudah selesai dieksekusi.
void main() {
// closure wajib disimpan di variabel
var tambahDua = buatPenambah(2); // disimpan ke angkaTambahan
// jika kita langsung print functionnya tanpa menyimpan ke variabel outputnya adalah (String key) => "$key = $angkaTambahan";
print(buatPenambah(2));
print(tambahDua(3)); // Output: 5 (3 + 2)
}
Function buatPenambah(int angkaTambahan) {
return (String key) => "$angka = $angkaTambahan";
}
Tipe Function di Dart adalah tipe data yang digunakan untuk merepresentasikan fungsi. Artinya, kita bisa menyimpan fungsi dalam variabel, mengirim fungsi sebagai argumen ke fungsi lain, atau mengembalikan fungsi dari suatu fungsi.
Kapan Pakai Tipe Function?
- Membuat higher-order function (fungsi yang menerima/mengembalikan fungsi).
- Menyimpan fungsi dalam variabel untuk dipanggil nanti.
- Menerapkan callback (misal: event handler, async operations).
a. Deklarasi Variabel dengan Tipe Function
void greet() {
print("Hello, Dart!");
}
void main() {
Function sayHello = greet; // Menyimpan fungsi `greet` ke variabel `sayHello`
sayHello(); // Memanggil fungsi melalui variabel
}
/** Output:
* Hello, Dart!
*/
b. Fungsi sebagai Parameter (Higher-Order Function)
// saat kirim parameter di index ke 3 harus bertipe function, dimana function tersebut akan digunakan untuk melakukan proses dari parameter a dan b
void prosesInput(int a, int b, Function operasi) {
print(operasi(a, b));
}
int tambah(int x, int y) => x + y;
int kali(int x, int y) => x * y;
void main() {
prosesInput(3, 4, tambah);
prosesInput(3, 4, kali); // Output: 12
}
c. Fungsi Mengembalikan Fungsi
contoh dibawah ini adalah lexical closure
Function buatPenambah(int n) {
return (int x) => x + n; // Mengembalikan fungsi lambda
}
void main() {
var tambahLima = buatPenambah(5); // `tambahLima` sekarang adalah fungsi (x) => x + 5
print(tambahLima(10)); // Output: 15
}
d. Tipe Fungsi yang Lebih Spesifik
int hitung(int a, int b, int Function(int, int) operasi) {
return operasi(a, b);
}
void main() {
int hasil = hitung(6, 3, (x, y) => x - y); // Fungsi lambda sebagai argumen
print(hasil); // Output: 3
}
/** Penjelasan
* int Function(int, int) artinya:
* - Fungsi yang menerima 2 parameter harus int.
* - Fungsi tersebut akan mengembalikan nilai int.
*/