DART
FUNCTION
VARIABLE
NULL
LIST
MAP
BAB 2 — DASAR BAHASA DART
Fondasi Pemrograman Mobile Development
Kelas 10 IT Semester 1 Front-End Master Class

Gunakan untuk navigasi

02

Daftar Isi

Klik topik mana saja untuk langsung melompat ke materinya.

03

Rekap BAB 1 → Jembatan ke BAB 2

Yang sudah kamu tahu

📱 BAB 1 — Pengenalan

Kamu sudah kenal Flutter (alat untuk membuat aplikasi), Dart (bahasanya), dan kenapa Dart dipakai: cepat, modern, dan satu kode untuk Android & iOS.

Yang akan kamu pelajari

🚀 BAB 2 — Sintaks & Logika

Sekarang kita masuk ke cara menulis kode Dart: menyimpan data, mengambil keputusan, mengulang aksi, dan membuat fungsi. Diakhiri membuat Kalkulator!

🧱

Analogi: Membangun Rumah

BAB 1 adalah melihat denah & memahami alat. BAB 2 adalah memegang batu bata pertama. Variable, tipe data, dan fungsi adalah bata yang menyusun seluruh aplikasi.

04

Apa itu Variable?

📦

Analogi: Kotak Penyimpanan

Variable itu seperti kotak berlabel. Setiap kotak punya nama dan bisa diisi sesuatu. Kalau kamu butuh isinya, cukup sebut nama kotaknya.

Contoh: kotak bernama nama berisi tulisan "Rifqi".

🔤
nama
🖱️ klik kotak untuk membuka
📦 nama = "Rifqi"
// Membuat kotak (variable) bernama 'nama' String nama = "Rifqi"; int umur = 16; // Mengambil isi kotak print(nama); // Rifqi

🎬 Demo: Isi Kotaknya

📦 nama
Rifqi
String nama = "Rifqi";
05

Tipe Data: String

🏷️

Analogi: Label Nama

String adalah tipe data untuk teks — huruf, kata, kalimat. Seperti label nama yang ditempel di barang. Selalu ditulis di dalam tanda kutip "...".

" "
✏️ String selalu di dalam tanda kutip "..."
"Halo" "SMK" "Dart 🎯" "Rifqi"
String sekolah = "SMK Negeri 1"; String hobi = "Coding"; // Menggabungkan teks (interpolasi) print("Aku suka $hobi di $sekolah");

🎬 Demo Penggabungan

Aku suka Coding di SMK 1
06

Tipe Data: int & double

⚖️

Analogi: Timbangan & Kalkulator

int = bilangan bulat (1, 50, -7), seperti jumlah buku.
double = bilangan desimal (1.5, 3.14), seperti angka di timbangan digital.

int
32
bilangan bulat
tanpa koma
vs
double
170.5
bilangan desimal
ada koma
int jumlahSiswa = 32; double tinggiBadan = 170.5; double rataRata = 88.75;

🎬 Demo: Counter Angka

0

int bertambah/berkurang 1

07

Tipe Data: bool

💡

Analogi: Lampu On/Off

bool hanya punya 2 nilai: true (benar/nyala) atau false (salah/mati). Seperti saklar lampu — tidak ada di tengah.

sudahLulus = false
bool sudahLulus = false; bool hadir = true; if (hadir) print("Absen tercatat");
Saklar?
true → 💡 Nyala
false → ⚫ Mati
08

Tipe Data List — Konsep Dasar

List adalah wadah terurut yang dapat menyimpan banyak nilai sekaligus dalam satu variabel. Setiap elemen memiliki nomor urut (indeks) dimulai dari 0.

🛒

Analogi: Barisan Loker / Antrean

Bayangkan loker bernomor. Loker [0] berisi "Apel", Loker [1] berisi "Pisang". Jika kamu ingin mengambil isinya, kamu panggil nomor lokernya.

[0]🍎"Apel"
[1]🍌"Pisang"
[2]🍊"Jeruk"
List<String> buah = ["Apel", "Pisang", "Jeruk"]; // Akses elemen dengan [indeks] print(buah[0]); // Apel print(buah[1]); // Pisang // Properti Utama print(buah.length); // 3 (Total data) print(buah.first); // Apel print(buah.last); // Jeruk print(buah.isEmpty); // false
09

Method List: Menambah & Menyisipkan

Method untuk memasukkan data baru ke dalam List di posisi akhir atau di tengah indeks spesifik.

add(element) Menambah ke Paling Belakang
🎯 Tujuan

Memasukkan 1 elemen baru di ujung paling akhir list.

💻 Sintaks buah.add("Ceri");
🔄 Sebelum vs Sesudah
Sebelum : ["Apel", "Pisang"]
Sesudah : ["Apel", "Pisang", "Ceri"]
💡 Penjelasan Hasil

Panjang list bertambah 1 (`length + 1`). Data baru mendapat nomor indeks paling akhir.

addAll([item1, item2]) Menambah Banyak Data Sekaligus
🎯 Tujuan

Menggabungkan sekumpulan data dari list lain sekaligus di paling akhir.

💻 Sintaks buah.addAll(["Ceri", "Melon"]);
🔄 Sebelum vs Sesudah
Sebelum : ["Apel"]
Sesudah : ["Apel", "Ceri", "Melon"]
💡 Penjelasan Hasil

Lebih cepat dan ringkas daripada memanggil `.add()` secara berulang-ulang.

insert(index, element) Menyisipkan di Posisi Spesifik
🎯 Tujuan

Menyelipkan elemen di nomor indeks tertentu tanpa menimpa/menghapus data lama.

💻 Sintaks buah.insert(1, "Mangga");
🔄 Sebelum vs Sesudah
Sebelum : ["Apel", "Pisang"] (idx 0, 1)
Sesudah : ["Apel", "Mangga", "Pisang"] (idx 0, 1, 2)
💡 Penjelasan Hasil

Data lama di posisi indeks tersebut dan seterusnya otomatis tergeser mundur 1 posisi (+1 indeks).

10

Method List: Menghapus Data

Method untuk menghapus elemen berdasarkan nilai, posisi indeks, atau mengosongkan list.

remove(value) Hapus Berdasarkan Nilai
🎯 Tujuan

Mencari dan menghapus kemunculan pertama elemen berdasarkan namanya.

💻 Sintaks bool sukses = buah.remove("Pisang");
🔄 Sebelum vs Sesudah
Sebelum : ["Apel", "Pisang", "Ceri"]
Sesudah : ["Apel", "Ceri"]
💡 Penjelasan Hasil

Mengembalikan true jika data ditemukan & berhasil dihapus, atau false jika data tidak ada.

removeAt(index) Hapus Berdasarkan Nomor Indeks
🎯 Tujuan

Menghapus elemen di nomor posisi indeks tertentu.

💻 Sintaks String terhapus = buah.removeAt(0);
🔄 Sebelum vs Sesudah
Sebelum : ["Apel", "Pisang", "Ceri"] (idx 0,1,2)
Sesudah : ["Pisang", "Ceri"] (idx 0,1)
💡 Penjelasan Hasil

Mengembalikan objek yang dihapus ("Apel"). Elemen setelahnya tergeser maju 1 posisi (-1 indeks).

clear() Mengosongkan Seluruh List
🎯 Tujuan

Menghapus semua elemen dari list tanpa mengikis variabelnya.

💻 Sintaks buah.clear();
🔄 Sebelum vs Sesudah
Sebelum : ["Apel", "Pisang", "Ceri"]
Sesudah : [] (length = 0)
💡 Penjelasan Hasil

List menjadi kosong total (`isEmpty == true`).

11

Method List: Pencarian & Pengurutan

Method untuk mengecek keberadaan data, mencari indeks, dan mengurutkan posisi elemen.

contains(value) Memeriksa Keberadaan Data
🎯 Tujuan

Cek apakah suatu nilai ada di dalam list (untuk pengkondisian `if`).

💻 Sintaks bool ada = buah.contains("Apel");
🔄 Sebelum vs Sesudah
List : ["Apel", "Pisang"]
Cek "Apel" → true | Cek "Jeruk" → false
💡 Penjelasan Hasil

Mengembalikan nilai boolean `true` atau `false` tanpa mengubah isi list.

indexOf(value) Mencari Posisi Indeks
🎯 Tujuan

Mencari nomor indeks lokasi ditemukannya suatu nilai.

💻 Sintaks int idx = buah.indexOf("Pisang");
🔄 Sebelum vs Sesudah
List : ["Apel", "Pisang", "Ceri"]
indexOf("Pisang") → 1 | indexOf("Nanas") → -1
💡 Penjelasan Hasil

Mengembalikan integer lokasi indeks. Angka `-1` menandakan data tidak ada di list.

sort() & reversed Mengurutkan & Membalikkan
🎯 Tujuan

`sort()` merapikan urutan (A-Z / 1-9). `reversed` membalik urutan.

💻 Sintaks buah.sort(); | List b = buah.reversed.toList();
🔄 Sebelum vs Sesudah
Sebelum : ["Ceri", "Apel", "Beras"]
Setelah sort() : ["Apel", "Beras", "Ceri"]
💡 Penjelasan Hasil

`sort()` mengubah list asli (*mutate*). `.reversed` mengembalikan `Iterable` baru.

12

List Playground & Demo Live

Uji coba langsung semua method List yang dipelajari dan lihat hasil eksekusinya secara real-time!

🎬 Demo Interaktif List Playground

> Eksekusi method List akan muncul di sini...
belanja.length = 3
13

Tipe Data Map — Konsep Key-Value

Map menyimpan data berpasangan Key (Kunci) → Value (Nilai). Kunci bersifat unik dan dipakai untuk mengakses nilainya.

📇

Analogi: Buku Kontak HP / Kamus

Kamu tidak mencari nomor telepon ibu berdasarkan nomor urut antrean, tapi berdasarkan **nama kuncinya ("Ibu")**.

"Ibu""0812-111"
"Guru""0813-222"
Map<String, String> kontak = { "Ibu": "0812-111", "Guru": "0813-222" }; // Akses nilai menggunakan [Key] print(kontak["Ibu"]); // 0812-111 // Properti Utama Map print(kontak.length); // 2 print(kontak.keys); // (Ibu, Guru) print(kontak.values); // (0812-111, 0813-222)
14

Method Map: Menambah & Mengedit

Method untuk memasukkan data baru atau memperbarui nilai dari kunci yang sudah ada.

map[key] = value Tambah Data Baru / Update Nilai
🎯 Tujuan

Membuat pasangan data baru, atau **menimpa (overwrite)** nilai lama jika Key sudah pernah dibuat.

💻 Sintaks stok["Pensil"] = 5;
🔄 Sebelum vs Sesudah
Sebelum : {"Buku": 10}
Tambah : stok["Pensil"] = 5 → {"Buku": 10, "Pensil": 5}
Update : stok["Buku"] = 15 → {"Buku": 15, "Pensil": 5}
💡 Penjelasan Hasil

Operator `[]=` otomatis mendeteksi keberadaan Key. Sangat praktis & fleksibel.

putIfAbsent(key, () => val) Tambah HANYA Jika Key Belum Ada
🎯 Tujuan

Melindungi data lama agar tidak sengaja tertimpa jika Key sudah ada sebelumnya.

💻 Sintaks kontak.putIfAbsent("Ibu", () => "0999");
🔄 Sebelum vs Sesudah
Sebelum : {"Ibu": "0812"}
Hasil : Nilai "Ibu" TETAP "0812" (tidak berubah ke "0999")
💡 Penjelasan Hasil

Aman dari ketidaksengajaan *overwriting* nilai variabel penting.

15

Method Map: Hapus & Inspeksi

Method untuk menghapus entry kunci-nilai, mengecek kunci, dan mengosongkan Map.

remove(key) Hapus Berdasarkan Key
🎯 Tujuan

Menghapus pasangan Key-Value dari Map berdasarkan nama kuncinya.

💻 Sintaks String? val = kontak.remove("Guru");
🔄 Sebelum vs Sesudah
Sebelum : {"Ibu": "0812", "Guru": "0813"}
Sesudah : {"Ibu": "0812"}
💡 Penjelasan Hasil

Mengembalikan nilai (*Value*) dari Key yang terhapus (misal `"0813"`). Jika Key tak ada → mengembalikan `null`.

containsKey(k) & containsValue(v) Inspeksi Key / Value
🎯 Tujuan

Memeriksa ketersediaan Kunci atau Nilai tertentu di dalam Map.

💻 Sintaks bool ada = kontak.containsKey("Ibu");
🔄 Sebelum vs Sesudah
kontak : {"Ibu": "0812"}
containsKey("Ibu") → true | containsKey("Ayah") → false
💡 Penjelasan Hasil

Mengembalikan `bool`. `containsKey` diproses sangat cepat oleh sistem internal Dart.

16

Map Playground & Demo Live

Uji coba langsung semua method Map yang dipelajari dan lihat perubahan tabel kuncinya!

🎬 Demo Interaktif Map Playground

> Eksekusi method Map akan muncul di sini...
kontak.length = 2
17

Koleksi Set & Matriks Perbandingan

Set adalah tipe data koleksi khusus di Dart yang **menolak data duplikat secara otomatis**.

// Deklarasi Set menggunakan kurung kurawal {} Set<String> warna = {"Merah", "Hijau", "Merah"}; print(warna); // {"Merah", "Hijau"} -> "Merah" ke-2 ditolak! // Method utama Set bool ditambahkan = warna.add("Merah"); // false (duplikat) warna.remove("Hijau"); print(warna.contains("Merah")); // true

🎬 Demo: List vs Set (Uji Duplikat)

Ketik nama item sama 2x untuk uji filter duplikat!

🛒 List (Terima Duplikat):
["Apel"]
💎 Set (Hanya Unik):
{"Apel"}
KriteriaList <T>Map <K, V>Set <T>
StrukturUrutan Indeks `[0, 1, 2]`Pasangan Key → ValueKumpulan Nilai Unik
DuplikatBoleh ada data duplikatKey Wajib Unik, Value BebasTIDAK BOLEH Duplikat
Akses Data`list[0]``map["Ibu"]``set.contains("item")`
PenggunaanAntrean, daftar belanjaKontak, profil, kamusKumpulan ID unik, tag unik
18

Operator

Operator adalah simbol untuk mengolah data: berhitung, membandingkan, dan logika.

Aritmatika

➕ Berhitung

+ - * / % (sisa bagi)

Perbandingan

⚖️ Membandingkan

== != > < >= <= → hasil bool

Logika

🔗 Menggabung

&& (dan) || (atau) ! (bukan)

🎬 Kalkulator Operator

15 + 4 = 19
19

Percabangan 1: `if` Saja (Pengecekan)

Struktur keputusan paling dasar. Kode di dalam blok if HANYA dijalankan jika kondisi bernilai true. Jika false, kode dilewati!

💳

Analogi: Gerbang Tol / E-Money

Ketika menempelkan kartu: JIKA (if) saldo ≥ 10.000, maka palang terbuka. Jika saldo tidak cukup, tidak ada aksi pembukaan pintu.

🟢 PINTU TERBUKA (MASUK)
Mulai
saldo ≥ 10000 ?
TRUE → 🟢 Buka Pintu
FALSE → ⏭️ Dilewati
int saldo = 15000; // Pengecekan Tunggal (Hanya 'if') if (saldo >= 10000) { print("Silakan Masuk ✅"); } print("Perjalanan dilanjutkan...");

🎬 Live Demo: Cek E-Money (if Saja)

Tarif = 10.000
if (saldo >= 10000) → TERBACA! Print: "Silakan Masuk ✅"
20

Percabangan 2: `if - else` (Dua Jalur)

Digunakan ketika ada 2 kemungkinan keputusan. Jika syarat if terpenuhi (true), jalankan blok A. Jika tidak (false), jalankan blok else (blok B).

🚦

Analogi: Lampu Lalu Lintas / KKM Ujian

Komputer memilih salah satu dari 2 jalan: JIKA nilai ≥ 75 → LULUS, SELAIN ITU (else)REMIDI. Tidak mungkin dua-duanya berjalan.

Mulai
nilai ≥ 75 ?
YA (if) → 🎉 LULUS
TIDAK (else) → 📕 REMIDI
int nilai = 80; if (nilai >= 75) { print("LULUS 🎉"); } else { print("REMIDI 📕"); }

🎬 Cek Kelulusan (Live)

KKM = 75
LULUS 🎉 (Jalur if)
21

Percabangan 3: `if - else if - else` (Multi Kondisi)

Digunakan ketika ada banyak pilihan kondisi (> 2). Dart mengecek dari atas ke bawah. Begitu ada kondisi yang true, blok tersebut dijalankan dan sisanya diabaikan!

🏅

Analogi: Tingkat Grade Nilai Sekolah

Evaluasi berjenjang: Cek dulu apakah nilai ≥ 90 (Grade A). Jika tidak, cek apakah ≥ 80 (Grade B), dst. Jika semua syarat di atas false, masuk ke else terakhir (Grade E).

1. if (nilai ≥ 90) → Grade A
2. else if (nilai ≥ 80) → Grade B
3. else if (nilai ≥ 70) → Grade C
4. else if (nilai ≥ 60) → Grade D
5. else → Grade E (Default)
int nilai = 85; if (nilai >= 90) { print("Grade A 🌟"); } else if (nilai >= 80) { print("Grade B 👍"); } else if (nilai >= 70) { print("Grade C 👌"); } else { print("Grade E ❌"); }

🎬 Live Demo: Evaluasi Grade Multi-Kondisi

Grade: B 👍
> Dieksekusi pada: Baik (Kondisi 2: else if n ≥ 80)
22

Percabangan 4: Operator Ternary (? :)

Bentuk singkat (shorthand / shortcut) dari if-else sederhana. Memungkinkan kita mengambil keputusan dan mengembalikan nilai hanya dalam 1 baris kode!

Analogi: Jalur Express / Shortcut

Daripada menulis 5 baris kode if-else hanya untuk menetapkan 1 variabel, gunakan Operator Ternary agar kode jauh lebih bersih & rapi!

📌 Formulasi Operator Ternary
kondisi ? nilaiIfTrue : nilaiIfFalse;
  • ? → "Apakah kondisi ini TRUE?"
  • : → "Jika FALSE (else), gunakan nilai ini:"
// ❌ Cara Biasa (5 Baris) String status; if (nilai >= 75) { status = "LULUS"; } else { status = "REMIDI"; } // ✅ Cara Ternary (Ringkas 1 Baris!) String status = (nilai >= 75) ? "LULUS" : "REMIDI";

🎬 Live Demo: Diskon Member (Ternary Shorthand)

double diskon = isMember ? 0.20 : 0.0;
Total: Rp100.000 | Diskon: 20% | Bayar: Rp80.000
23

Percabangan 5: Switch Case

📺

Analogi: Remote TV

Tekan tombol channel → langsung pindah ke channel itu. switch memilih satu aksi dari banyak pilihan berdasarkan satu nilai. Lebih rapi daripada banyak if.

Senin
int hari = 1; switch (hari) { case 1: print("Senin"); break; case 2: print("Selasa"); break; default: print("Akhir pekan"); }
24

Looping: for

🌀

Analogi: Baling-baling Kipas

for dipakai saat kita tahu berapa kali harus mengulang. Seperti baling-baling yang berputar persis 5 kali lalu berhenti.

🌀
for (int i = 1; i <= 5; i++) { print("Putaran ke-$i"); }

🎬 Jalankan Loop

25

Looping: while

Analogi: Alarm Berbunyi

while mengulang selama syarat masih benar. Alarm terus berbunyi selama belum dimatikan. Berhenti begitu syarat jadi false.

🔔
int snooze = 0; while (snooze < 3) { print("Alarm bunyi! 🔔"); snooze++; // dekati syarat berhenti }

⚠️ Jangan lupa ubah kondisi di dalam loop, atau loop tak akan berhenti (infinite loop)!

26

Looping: do while

💊

Analogi: Minum Obat Pertama

do while menjalankan aksi minimal SEKALI dulu, baru cek syarat. Kamu pasti minum dosis pertama, baru cek "perlu lagi tidak?".

DO 💊 Minum dulu! (pasti 1×)
WHILE dosis < 3 ?
💊 💊 💊
✅ Selalu minimal 1 kali jalan
int dosis = 0; do { print("Minum obat 💊"); dosis++; } while (dosis < 3);
Beda dengan while:
  • while: cek dulu → kalau false, 0 kali jalan
  • do while: jalan dulu → selalu minimal 1 kali
27

📥 User Input & dart:io

📥

Input Dinamis vs Statis

Sebelumnya kita membuat program dengan data statis:

String nama = "Rifqi"; print("Halo $nama");

Masalahnya: setiap ingin mengganti nama, kita harus mengubah kode program. Aplikasi nyata (seperti form login, kalkulator, pendaftaran) membutuhkan input dari pengguna saat program berjalan.

Library dart:io

Membuka Gerbang Input-Output

Dart menyediakan library bawaan bernama dart:io untuk menangani Input/Output. Kita harus meng-import library ini di baris paling atas kode kita:

import 'dart:io';

Dengan meng-import dart:io, program kita bisa menggunakan fitur input keyboard (stdin) dan output konsol (stdout).

28

Membaca Input: readLineSync()

Membaca Keyboard

stdin.readLineSync()

Untuk membaca apa yang diketik oleh user di keyboard, gunakan perintah:

stdin.readLineSync()

Perintah ini akan menghentikan sementara (pause) program, menunggu user mengetik sesuatu lalu menekan tombol Enter.

Karena user bisa saja langsung menekan Enter tanpa mengetik apa-apa, maka hasil input disimpan dalam tipe data yang boleh kosong (nullable String): String?

import 'dart:io'; void main() { print("Masukkan nama:"); // Menyimpan input ke variabel nama String? nama = stdin.readLineSync(); print("Halo $nama"); }

Alur Aliran Data:

⌨️ Keyboard User → 📥 stdin.readLineSync() → 📦 Variabel → 🖥️ Program
29

Input Angka & Konversi Tipe Data

Masalah

Hasil Input Selalu Berupa String

Perlu diingat bahwa stdin.readLineSync() selalu menghasilkan teks (String). Jika user mengetik 10, Dart akan menerimanya sebagai teks "10", bukan angka 10. Kita tidak bisa menjumlahkannya langsung!

Solusi

Konversi dengan parse()

Kita harus mengubah teks tersebut menjadi angka menggunakan parse():

  • String ke Integer: int.parse()
  • String ke Desimal: double.parse()
Null Assertion

Kenapa ada tanda seru (!) ?

Karena stdin.readLineSync() bisa bernilai null (kosong), sedangkan int.parse() membutuhkan teks yang pasti ada. Tanda ! (Null Assertion Operator) digunakan untuk meyakinkan Dart: "Saya jamin input ini tidak kosong!"

// Membaca input angka bulat int angka = int.parse(stdin.readLineSync()!); // Membaca input desimal double tinggi = double.parse(stdin.readLineSync()!);
30

Demo Interaktif: Simulasi Konsol Input

Rasakan bagaimana program Dart menerima input runtime dan memprosesnya secara dinamis!

📥 Simulasi Input Teks (String?)

print("Masukkan nama:"); String? nama = stdin.readLineSync(); print("Halo $nama");
> Program siap...

🔢 Simulasi Input Angka (int.parse)

int a = int.parse(stdin.readLineSync()!); int b = int.parse(stdin.readLineSync()!); print("Hasil = ${a + b}");
+
> Program siap...
31

Apa itu Function?

🧺

Analogi: Mesin Cuci Otomatis

Function (fungsi) adalah blok kode terpisah yang dirancang untuk melakukan tugas tertentu. Seperti mesin cuci otomatis: kamu cukup menekan tombol, dan mesin akan bekerja tanpa kamu harus mencuci manual setiap kali.

👕 input⚙️ proses✨ output
Definisi

Blok Kode yang Dapat Digunakan Kembali

Dalam programming, kita sering menulis kode yang sama berulang-ulang. Daripada melakukan itu, kita membungkus kode tersebut di dalam sebuah Function. Ketika kita membutuhkannya, kita cukup memanggil namanya.

Konsep ini dikenal sebagai DRY (Don't Repeat Yourself) — prinsip utama untuk menulis kode yang bersih dan profesional.

32

Kenapa Function Dibutuhkan?

Tanpa Function (Buruk)

Kode Berulang & Keras Kepala

Bayangkan jika kamu harus menyapa 3 siswa yang berbeda. Tanpa function, kamu harus menulis print berulang-ulang:

print("Halo Rifqi, selamat belajar Dart!"); print("Halo Budi, selamat belajar Dart!"); print("Halo Ani, selamat belajar Dart!");

Bagaimana kalau ada 100 siswa? Atau kalau kalimat sapaannya ingin diganti? Kamu harus mengubah 100 baris kode satu per satu!

Dengan Function (Efisien)

Cukup Ubah Satu Tempat

Dengan function, kita membungkus pola kalimat sapaan tersebut:

void sapaSiswa(String nama) { print("Halo $nama, selamat belajar Dart!"); }

Jika ingin mengubah kalimatnya, kamu cukup mengedit di dalam function saja, dan seluruh pemanggilan akan otomatis berubah!

33

Struktur Function Dart

Mari kita bedah anatomi dari sebuah function di Dart:

int tambah(int a, int b) { return a + b; }

Bagian-Bagian Function:

  • int (Return Type) → Tipe data dari hasil akhir yang dikeluarkan (output).
  • tambah (Nama Function) → Nama unik untuk memanggil function ini.
  • int a (Parameter 1) → Variabel input pertama yang diterima.
  • int b (Parameter 2) → Variabel input kedua yang diterima.
  • return → Mengirim hasil keluar dari function.

🧩 Alur Visual Input & Output

INPUT (Parameter)
a = 5
b = 3
PROSES
tambah()
5 + 3
OUTPUT (Return)
8

Sama seperti mesin: masukkan data → diolah → keluar hasil.

34

Membuat vs Memanggil Function

📢

PENTING: Function Harus Dipanggil!

Banyak pemula bingung karena kodenya tidak menghasilkan apa-apa. Ingat prinsip ini:

Membuat function ≠ Menjalankan function

Membuat function itu seperti membeli mesin cuci. Mesin tidak akan mencuci bajumu sebelum kamu menekan tombol Start (Memanggilnya).

void salam() { print("Halo Dart"); }

🎬 Demo Pemanggilan Function

> klik tombol untuk mencoba...
35

1. Function Tanpa Parameter (Void)

Tipe Sederhana

Definisi Void & Tanpa Input

Function ini tidak memerlukan input apapun untuk berjalan. Kata kunci void menandakan bahwa function ini tidak menghasilkan/mengembalikan data (*no return value*), melainkan langsung melakukan aksi (seperti melakukan print).

void halo() { print("Hello Dart"); } // Cara Memanggil: halo();

🎬 Demo Live: Void Function

Klik tombol di bawah untuk menjalankan function halo()

Output: (menunggu...)
36

2. Function Dengan Parameter (Input)

Menerima Input

Menyesuaikan Aksi Berdasarkan Data

Parameter adalah variabel penampung data input yang diletakkan di dalam kurung (String nama). Function akan memproses nilai ini secara dinamis sesuai dengan argumen yang dilewatkan saat pemanggilan.

void halo(String nama) { print("Halo $nama"); } // Cara Memanggil: halo("Rifqi");

🎬 Demo Live: Function Berparameter

Masukkan nama kamu di bawah, lalu panggil functionnya!

Output: (menunggu...)
37

3. Function Dengan Return (Output)

Menghasilkan Nilai

Mengirim Data Keluar

Jika kita ingin function menghasilkan suatu nilai yang bisa kita simpan ke variabel atau kita olah lagi, kita wajib menggunakan return type di awal deklarasi dan kata kunci return di akhir function.

int kali(int a, int b) { return a * b; } // Cara Memanggil: print(kali(5, 2)); // Output: 10

🎬 Demo Live: Function dengan Return

Uji perhitungan perkalian menggunakan function kali(a, b):

×
print(kali(5, 2)) → 10
38

4. Arrow Function (Sintaks & Bentuk Singkat)

Sintaks Modern (=>)

Pengenalan & Implicit Return

Arrow Function adalah alternatif penulisan function yang lebih ringkas menggunakan operator panah (=>). Jika isi function hanya 1 baris return, kurung kurawal {} dan kata kunci return bisa dihilangkan (implicit return).

// Sintaks Standar Arrow Function const tambah = (a, b) => { return a + b; }; console.log(tambah(5, 3)); // Output: 8 // Bentuk Singkat (Implicit Return) const tambahSingkat = (a, b) => a + b; console.log(tambahSingkat(10, 20)); // Output: 30

🎬 Demo Live: Arrow Function

Uji coba penambahan angka menggunakan Arrow Function (a, b) => a + b

+
// Output akan tampil di sini
39

5 & 6. Arrow Function: Tanpa & Satu Parameter

Variasi Parameter

Fleksibilitas Sintaks Parameter

Arrow function memberikan fleksibilitas saat mendefinisikan parameter:

  • Tanpa Parameter: Wajib menggunakan kurung kosong ().
  • Satu Parameter: Tanda kurung () bersifat opsional dan boleh dihilangkan!
// 5. Tanpa Parameter const hello = () => { console.log("Hello Javascript"); }; hello(); // Output: Hello Javascript // 6. Satu Parameter (Tanpa Kurung) const nama = name => { console.log(name); }; nama("Rifqi"); // Output: Rifqi

🎬 Demo Live: Variasi Parameter

Uji pemanggilan tanpa parameter atau 1 parameter

// Output akan tampil di sini
40

7. Arrow Function dengan Array

Penggunaan Callback

Penggunaan pada Method Iterasi Array

Arrow function paling sering digunakan sebagai callback function pada method array seperti forEach, map, filter, dan reduce karena penulisannya yang sangat bersih dan ringkas.

const angka = [1, 2, 3, 4, 5]; // Menggunakan Arrow Function pada forEach: angka.forEach(item => { console.log(item); }); /* Output: 1 2 3 4 5 */

🎬 Demo Live: Callback Array forEach

Array: [1, 2, 3, 4, 5]

// Output iterasi akan muncul di sini
41

8. Nested Function (Function dalam Function)

Pengertian & Scope

Function di Dalam Function

Nested Function adalah function yang berada di dalam function lain. Function bagian dalam (dalam()) hanya dapat dipanggil dan diakses di dalam scope function luar (luar()).

function login() { console.log("Proses Login"); // Nested Function (Function Dalam) function validasi() { console.log("Validasi User"); } validasi(); // Memanggil function validasi() di dalam login() } login(); /* Output: Proses Login Validasi User */

🎬 Structure & Scope Hierarchy

login()
  │
  └── validasi() (Hanya berlaku di dalam scope login())
// Output eksekusi akan tampil di sini
42

9 & 10. Nested Function dengan Parameter & Arrow

Parameter & Arrow Scope

Akses Parameter & Arrow Syntax

Nested function dapat mengakses variabel & parameter dari function pembungkusnya. Selain itu, nested function juga bisa ditulis menggunakan sintaks Arrow Function.

// 9. Nested Function dengan Parameter function hitungDiskon(harga) { function diskon() { return harga * 0.1; // 10% diskon } return harga - diskon(); } console.log(hitungDiskon(100000)); // Output: 90000 // 10. Nested Arrow Function const aplikasi = () => { const database = () => { console.log("Mengakses Database"); }; database(); }; aplikasi(); // Output: Mengakses Database

🎬 Demo Live: Diskon & Nested Arrow

Masukkan harga belanja untuk dihitung diskon 10% secara internal:

// Output kalkulasi akan muncul di sini
43

11 & 12. Perbandingan & Studi Kasus

Perbandingan Syntax

11. Function Biasa vs Arrow Function

Function Biasa Arrow Function
Keyword function Menggunakan panah =>
Syntax lebih panjang Syntax lebih pendek
Memiliki this sendiri Tidak punya this sendiri
Cocok untuk method object Cocok untuk callback
Studi Kasus

12. Menghitung Total Belanja

// Function Biasa: function totalBelanja(harga, jumlah) { return harga * jumlah; } // Arrow Function: const totalBelanja = (harga, jumlah) => harga * jumlah; console.log(totalBelanja(5000, 3)); // Output: 15000

🎬 Demo Studi Kasus Total Belanja

Hitung total belanja dengan Function Biasa vs Arrow Function

// Hasil perbandingan akan tampil di sini
44

Latihan: Membuat Function

⭐ 30 poin Coding Challenge

📝 Terapkan Konsep Function Dart

Cobalah untuk membuat function-function berikut di editor Dart-mu:

  1. Buat function tanpa parameter bernama sapaSemua() yang mencetak tulisan "Halo semuanya, selamat belajar Dart!"
  2. Buat function dengan parameter bernama sapaSiswa(String nama, String kelas) yang mencetak tulisan "Halo [nama] dari kelas [kelas]!"
  3. Buat function dengan return bernama hitungLuasSegitiga(double alas, double tinggi) yang mengembalikan nilai luas segitiga dengan rumus 0.5 * alas * tinggi

💡 Petunjuk: panggil semua function tersebut di dalam method void main() untuk melihat hasilnya.

45

Null Safety

📭

Analogi: Kotak Kosong Berbahaya

null artinya "kotak kosong / belum ada isi". Kalau kita pakai isi kotak yang ternyata kosong → aplikasi error/crash! Dart melindungi kita dengan Null Safety.

⚠️
String? nama = null → BAHAYA
// Tanda ? = boleh kosong (nullable) String? nama = null; // ?? = nilai cadangan jika null print(nama ?? "Tanpa Nama"); // Tanpa ? = WAJIB ada isi (aman) String kota = "Jakarta";
  • String → wajib diisi, aman
  • String? → boleh null, hati-hati
  • ?? → sediakan nilai cadangan
46

Mini Project: Kalkulator

Gabungan dari semua yang dipelajari: variable, tipe data, operator, function, dan if-else. Coba langsung!

0

Uji: 15 + 27 = 42 ✓

47

Latihan 1

⭐ 20 poin Coding Challenge

📝 Buat Variabel Biodata Diri

Buat program Dart yang menyimpan biodata dirimu menggunakan tipe data yang tepat:

  1. Variabel nama (String)
  2. Variabel umur (int)
  3. Variabel tinggiBadan (double)
  4. Variabel sudahPunyaHP (bool)
  5. Tampilkan semua dengan print() menggunakan interpolasi $

💡 Petunjuk: String nama = "..."; lalu print("Nama: $nama");

48

Latihan 2

⭐ 30 poin Coding Challenge

🎓 Program Penentuan Kelulusan

Buat program yang menentukan status siswa berdasarkan nilai dengan if-else:

  1. Buat variabel nilai (int)
  2. Jika nilai ≥ 85 → "LULUS - Sangat Baik"
  3. Jika nilai ≥ 75 → "LULUS - Cukup"
  4. Selain itu → "REMIDI"
  5. Gunakan if / else if / else

💡 Petunjuk: urutkan kondisi dari nilai tertinggi ke terendah.

49

Tugas Akhir BAB

⭐ 50 poin Take-home Project

🧮 Kembangkan Kalkulator

Kembangkan Mini Project Kalkulator (slide 40) dengan menambah fitur:

  1. Buat function terpisah untuk tiap operasi: tambah(), kurang(), kali(), bagi()
  2. Gunakan switch untuk memilih operasi berdasarkan input operator
  3. Tangani pembagian dengan 0 menggunakan if (tampilkan pesan error, bukan crash)
  4. Tampilkan riwayat 3 perhitungan terakhir menggunakan List

💡 Kumpulkan file .dart + screenshot output. Deadline: 1 minggu.

50

Rangkuman BAB 2

📦 Data

Variable, String, int, double, bool, List, Map, Set untuk menyimpan informasi.

🔀 Logika

Operator, if-else, else-if, ternary & switch untuk mengambil keputusan.

🔁 Pengulangan

for, while, do-while untuk mengulang aksi.

⚙️ Fungsi

Function untuk membungkus proses agar bisa dipakai ulang.

🛡️ Null Safety

String? dan ?? untuk mencegah error data kosong.

🧮 Project

Kalkulator: bukti kamu bisa menggabung semuanya!

🎯

Preview BAB 3 — OOP (Object Oriented Programming)

Selanjutnya kamu akan belajar Class & Object: cara membuat "cetakan" untuk data yang kompleks, seperti membuat blueprint Mobil lalu mencetak banyak mobil. Sampai jumpa di BAB 3! 🚀