Belajar bagaimana aplikasi Flutter berpindah halaman β membuka layar baru, kembali, mengirim & menerima data, hingga membangun aplikasi banyak halaman.
Gunakan β β pada keyboard atau tombol di bawah untuk berpindah slide.
Setelah menyelesaikan BAB 8, kamu diharapkan mampu mencapai 6 tujuan berikut. Di sisi kanan, lihat peta konsep yang menghubungkan seluruh materi bab ini.
Menjelaskan konsep tumpukan halaman & prinsip LIFO dengan kata-kata sendiri.
Menulis Navigator.push() & Navigator.pop() tanpa referensi (target 80% akurat).
Mendaftarkan minimal 3 named route di MaterialApp dan menavigasinya.
Mengirim objek data dari halaman list ke detail lewat constructor.
Menerima data balik dari sub-halaman dengan async/await.
Membuat aplikasi Katalog Produk 3 halaman yang berfungsi penuh.
Semua topik bermuara pada satu inti: Navigation.
Di BAB 7 kamu sudah belajar membuat Form & Input β pengguna mengisi nama, email, lalu menekan tombol Submit. Tapi semuanya masih terjadi di satu halaman saja. Pertanyaan pemantiknya:
Kamu belajar Widget, Layout, dan menyusun tampilan satu halaman.
Pengguna mengisi form dan menekan tombol β tapi masih di layar yang sama.
Kini kita pelajari cara membuka layar baru, kembali, dan mengirim data antar halaman.
Hampir semua aplikasi nyata (Instagram, Shopee, Gojek) terdiri dari puluhan halaman. Kemampuan berpindah halaman adalah jantung dari aplikasi mobile yang sesungguhnya.
Navigation (navigasi) adalah proses berpindah dari satu halaman/layar ke halaman lain di dalam sebuah aplikasi. Di Flutter, setiap halaman disebut route (rute), dan yang mengatur perpindahan ini adalah widget bernama Navigator.
Bayangkan sebuah GEDUNG BERTINGKAT. Setiap lantai adalah satu halaman aplikasi. Untuk berpindah lantai, kamu naik LIFT. Nah, lift itulah Navigator β alat yang membawamu dari satu lantai (halaman) ke lantai lain.
naik = push
turun = pop
Flutter menyimpan halaman-halaman yang sedang terbuka dalam sebuah tumpukan (stack). Prinsipnya adalah LIFO β Last In, First Out (yang terakhir masuk, yang pertama keluar).
Seperti tumpukan nampan di kantin sekolah. Nampan baru selalu ditaruh di paling atas (PUSH). Saat mengambil, kamu juga mengambil dari paling atas dulu (POP). Nampan paling bawah keluar paling terakhir.
| Aksi | Efek pada Stack |
|---|---|
| push(Home) | [Home] |
| push(Detail) | [Home, Detail] |
| push(Profil) | [Home, Detail, Profil] |
| pop() | [Home, Detail] β Profil terangkat |
PUSH muncul dari bawah, POP menghilang ke atas
Navigator adalah widget khusus yang mengelola stack halaman. Kabar baiknya: saat kamu memakai MaterialApp, sebuah Navigator sudah otomatis tersedia di atas widget tree-mu. Jadi kamu tinggal memanggilnya lewat Navigator.of(context) atau cara singkat Navigator.push(...).
Navigator ibarat petugas resepsionis hotel yang memegang daftar tamu (stack). Dialah yang tahu kamu sedang di kamar mana dan ke mana kamu boleh pindah.
MaterialApp β Navigator (otomatis) β Halaman aktif. Karena Navigator berada di atas semua halaman, halaman manapun bisa memanggilnya melalui BuildContext.Navigator.push() dipakai untuk membuka/menumpuk halaman baru di atas halaman sekarang.
Seperti membuka pintu dan masuk ke ruangan baru. Ruangan lama masih ada di belakangmu β kamu tinggal masuk ke ruangan berikutnya.
Navigator.pop() dipakai untuk menutup halaman teratas dan kembali ke halaman di bawahnya.
Seperti keluar dari ruangan dan menutup pintu. Kamu kembali ke ruangan sebelumnya yang tadi kamu tinggalkan.
Menambah halaman baru ke atas tumpukan.
Masuk ruanganMajuStack bertambahMengangkat halaman teratas dari tumpukan.
Keluar ruanganMundurStack berkurang| Aspek | push() | pop() |
|---|---|---|
| Tujuan | Buka halaman baru | Kembali ke halaman lama |
| Efek stack | +1 halaman | β1 halaman |
| Argumen utama | context + Route | context (+ data opsional) |
| Tombol back AppBar | Muncul otomatis | Yang dipicu saat ditekan |
| Analogi pintu | Pintu terbuka, masuk | Pintu tertutup, keluar |
Daripada menulis MaterialPageRoute berulang-ulang, kita bisa memberi setiap halaman sebuah nama/alamat (misalnya '/detail'). Ini disebut Named Route. Navigasi jadi lebih rapi dan mudah dikelola untuk aplikasi besar.
Seperti nama jalan di sebuah kota. Daripada menjelaskan "rumah ketiga setelah belokan", kamu cukup sebut alamatnya: "Jl. Merdeka No. 10". Setiap tempat punya nama unik.
/profil" dan Navigator tahu halaman mana yang dimaksud.Titik biru bergerak = pengguna berpindah dari satu "alamat" ke alamat lain mengikuti nama route.
Semua nama route didaftarkan dalam properti routes: { } milik MaterialApp. Bentuknya adalah Map: kuncinya nama route (String), nilainya fungsi yang membangun halaman.
Menentukan halaman pertama yang tampil saat aplikasi dibuka (di sini '/').
Pasangan nama β builder halaman. Tambah baris baru untuk setiap halaman baru.
Gunakan nama yang jelas dan diawali garis miring, mis. '/keranjang', '/checkout'.
Setelah route didaftarkan, cukup panggil Navigator.pushNamed() dengan nama route tujuan. Jauh lebih singkat!
Jika kamu memanggil nama route yang belum didaftarkan, aplikasi akan error. Sediakan onUnknownRoute sebagai pengaman:
Sering kali halaman baru butuh data dari halaman sebelumnya β misal halaman detail butuh tahu produk mana yang diklik. Cara paling umum: kirim data lewat constructor halaman tujuan.
Seperti mengirim amplop berisi pesan ke alamat tujuan. Isi amplop (data) dibawa langsung ke penerima (halaman tujuan).
Kadang halaman tujuan harus mengembalikan hasil ke halaman asal β misal halaman "Pilih Warna" mengembalikan warna yang dipilih. Caranya: kirim data lewat Navigator.pop(hasil), lalu tangkap dengan async/await.
Seperti balasan surat atau laporan tugas yang dikembalikan guru. Kamu kirim surat (push), lalu menunggu balasannya (await) sebelum melanjutkan.
await membuat aplikasi "menunggu" sampai sub-halaman ditutup, lalu nilai dari pop() menjadi isi variabel hasil.Klik tombol PUSH untuk menumpuk halaman baru, dan POP untuk mengangkat halaman teratas. Perhatikan bagaimana tumpukan berubah sesuai prinsip LIFO.
Yang terakhir di-push akan jadi yang pertama di-pop (LIFO).
Aplikasi nyata terdiri dari banyak halaman yang saling terhubung. Multi Page App adalah pola di mana kamu menyusun beberapa halaman, mendaftarkannya sebagai route, lalu mengatur alur navigasi di antara mereka.
Seperti sebuah buku dengan banyak halaman dan daftar isi. Daftar isi (routes) memberi tahu di mana setiap halaman berada, dan kamu bisa lompat ke halaman manapun.
Titik awal. Berisi MaterialApp + daftar routes + initialRoute.
Menampilkan daftar item. Setiap item β pushNamed('/detail') sambil mengirim data.
Menerima data dari Home, menampilkannya. Tombol kembali β pop().
Profil, Keranjang, dsb. Semua terdaftar di routes dan saling terhubung lewat Navigator.
Kunci aplikasi multi-halaman yang rapi: pisahkan tiap halaman ke widget/class sendiri, daftarkan di routes, dan gunakan passing data untuk komunikasi antar halaman.
Saatnya menggabungkan semua! Kita akan membangun Aplikasi Katalog Produk dengan 2 halaman utama: Daftar Produk dan Detail Produk. Saat produk diklik, datanya dikirim ke halaman detail.
Klik produk β
kirim data via constructor βNavigator.push
Tombol kembali βNavigator.pop
Rp 250.000
Sepatu ringan untuk lari pagi, nyaman & awet.
Pada slide berikutnya kita tulis kodenya bertahap: Bagian 1 (main + daftar) lalu Bagian 2 (detail + passing data).
Rp 250000
Navigator.push(). Di Halaman B, sediakan tombol "Kembali" yang memakai Navigator.pop().Buat dua StatelessWidget: HalamanA dan HalamanB.
Di Halaman A, tambahkan ElevatedButton dengan Navigator.push menuju Halaman B.
Di Halaman B, tambahkan tombol Navigator.pop untuk kembali.
Beri AppBar berbeda di tiap halaman agar mudah dibedakan.
| Kriteria | Skor |
|---|---|
| Dua halaman terpisah berfungsi | 25 |
| push() benar membuka Halaman B | 30 |
| pop() benar kembali ke Halaman A | 30 |
| Kerapian kode & komentar | 15 |
| Total | 100 |
Daftarkan 3 route di routes: {}: '/', '/profil', '/tentang'.
Gunakan pushNamed dengan arguments untuk mengirim nama teman ke halaman profil.
Ambil data dengan ModalRoute.of(context)!.settings.arguments di Halaman Profil.
Tambahkan tombol menuju Halaman Tentang dari Home.
| Kriteria | Skor |
|---|---|
| Minimal 3 named route terdaftar | 25 |
| pushNamed berfungsi semua | 25 |
| Passing data nama berhasil tampil | 30 |
| Halaman Tentang dapat diakses | 10 |
| Kerapian kode | 10 |
| Total | 100 |
.dart + screenshot tiap halaman.pop(value).| Aspek | Bobot |
|---|---|
| Navigasi push/pop berfungsi | 20 |
| Passing data produk benar | 20 |
| Return data favorit berfungsi | 25 |
| Named route diterapkan | 15 |
| UI rapi & konsisten | 10 |
| Kode bersih + komentar | 10 |
| Total | 100 |
Nilai β₯ 80 = Sangat Baik Β· 60β79 = Baik Β· < 60 = Perlu remedial.
π Selamat! Kamu telah menyelesaikan BAB 8 β Navigation & Routing.