Navigator: mengelola layar di Flutter

Penulis: IT Sectr Diterbitkan: 2026-07-02 Waktu membaca: 9 mnt

Navigator — adalah widget-manajer navigasi di Flutter yang mengelola tumpukan rute (Route) untuk berpindah antar layar melalui metode push, pop, pushReplacement, dan pushNamed. Tidak seperti penggantian widget langsung melalui State, Navigator bekerja pada tingkat seluruh layar: ia menyimpan riwayat transisi dan mendukung animasi platform. Menurut Flutter API Reference (2026), Navigator 2.0 (Router) menyediakan manajemen navigasi deklaratif untuk skenario kompleks dengan tautan dalam dan desain adaptif. Dalam aplikasi tipikal, Navigator memastikan perilaku tombol “Kembali” yang benar di Android dan gerakan gesek di iOS.

Poin Penting

  • Navigator — manajer navigasi, mengelola tumpukan rute melalui metode push, pop, pushNamed, pushReplacement, dan pushAndRemoveUntil
  • Tumpukan rute — Navigator menyimpan layar dalam tumpukan LIFO: setiap push menambahkan layar di atas, pop menghapus yang teratas
  • pushNamed — navigasi melalui rute bernama yang didefinisikan di MaterialApp.routes atau onGenerateRoute
  • pushReplacement — mengganti layar saat ini dengan yang baru tanpa bisa kembali ke sebelumnya (misalnya, setelah login)
  • Navigator 2.0 — API deklaratif dengan Router, RouterDelegate, dan RouteInformationParser untuk navigasi web dan desktop

Apa itu Navigator di Flutter

Navigator — adalah widget yang mengelola tumpukan objek Route dan mengimplementasikan navigasi layar di aplikasi Flutter. Setiap panggilan push menempatkan Route baru di atas tumpukan, pop menghapus Route teratas dan kembali ke layar sebelumnya. MaterialApp secara otomatis membuat Navigator untuk seluruh aplikasi, membuatnya dapat diakses melalui Navigator.of(context).

Tidak seperti StatefulWidget, di mana penggantian konten terjadi melalui setState di dalam satu widget, Navigator beroperasi pada seluruh layar dengan siklus hidupnya sendiri. Setiap Route dalam tumpukan adalah status terisolasi dengan BuildContext sendiri, yang mencegah kebocoran memori dan menyederhanakan manajemen dependensi. Saat pop dipanggil, Route yang tidak digunakan akan dimusnahkan, membebaskan sumber daya.

Menurut Flutter Navigation Guide (2026), Navigator telah berevolusi dari API imperatif (Navigator 1.0) ke deklaratif (Navigator 2.0). Navigator 1.0 menggunakan metode push/pop secara langsung, yang nyaman untuk skenario sederhana. Navigator 2.0 (Router) cocok untuk aplikasi dengan tautan dalam, navigasi adaptif, dan perutean web.

Bagaimana Navigator bekerja di dalamnya

Di dalam, Navigator menggunakan Overlay — widget khusus yang menampilkan Route satu di atas yang lain. Setiap Route membuat posisinya sendiri di Overlay dengan indeks Z yang sesuai dengan kedalaman di tumpukan. Ini menjelaskan mengapa saat push layar baru dianimasikan di atas yang sebelumnya, dan saat pop — layar sebelumnya sudah siap ditampilkan: ia tidak dimusnahkan, hanya tetap di Overlay di bawah yang baru.

Untuk animasi transisi, Navigator menggunakan PageTransitionsTheme, yang dapat ditimpa di ThemeData. Animasi platform diatur melalui CupertinoPageRoute untuk iOS (geser dari kanan) dan MaterialPageRoute untuk Android (geser dari bawah). Navigator secara otomatis memilih animasi yang tepat saat menggunakan PlatformRoute.

Navigator menyediakan serangkaian metode untuk mengelola tumpukan Route. Setiap metode menyelesaikan tugas navigasi tertentu — dari transisi sederhana hingga penggantian lengkap riwayat layar. Mari kita lihat metode utama dengan contoh penggunaan.

MetodeDeskripsiSkenario Penerapan
pushMenambahkan Route ke atas tumpukanPindah ke layar baru dengan kemungkinan kembali
popMenghapus Route teratas dari tumpukanKembali ke layar sebelumnya
pushReplacementMengganti Route saat ini dengan yang baruSetelah login — layar login diganti dengan layar utama
pushAndRemoveUntilMenambahkan Route dan menghapus sebelumnya hingga kondisiKeluar ke layar utama dengan membersihkan riwayat
popUntilMenghapus Route dari tumpukan hingga kondisi tercapaiKembali ke layar tertentu dalam riwayat
maybePopMemanggil pop hanya jika tumpukan berisi >1 RouteMencegah penutupan aplikasi saat penekanan tidak sengaja

Push dan Pop: operasi dasar

Metode push menerima Route dan mengembalikan Future dengan hasil yang diteruskan saat pop. Ini memungkinkan menerima data dari layar yang kita tuju. Misalnya, layar pemilihan tanggal dapat mengembalikan DateTime melalui Navigator.pop(context, selectedDate). Metode pop tanpa argumen mengembalikan null, dengan argumen — meneruskan nilai ke layar pemanggil.

PushReplacement: penggantian layar

pushReplacement mengganti Route saat ini dengan yang baru, menghapus yang saat ini dari tumpukan. Ini penting dalam skenario di mana pengguna tidak boleh kembali ke layar sebelumnya. Contoh tipikal — layar login: setelah berhasil masuk, layar saat ini diganti dengan layar utama, dan tombol “Kembali” tidak kembali ke formulir login.

Rute bernama dan onGenerateRoute

Navigator mendukung navigasi melalui rute bernama dengan metode pushNamed. Alih-alih membuat Route secara langsung, pengembang menentukan pengenal teks, dan Navigator secara otomatis membuat Route berdasarkan konfigurasi di MaterialApp. Ini menyederhanakan kode dan memusatkan definisi rute di satu tempat.

Rute bernama didefinisikan melalui properti routes di MaterialApp, di mana setiap kunci adalah string jalur dan nilainya adalah fungsi yang mengembalikan Widget. Untuk rute dinamis (dengan parameter), digunakan onGenerateRoute — callback yang menerima RouteSettings dan mengembalikan Route. Ini memungkinkan penerusan argumen melalui arguments dan implementasi navigasi dalam.

Menurut Flutter Cookbook (2026), penerusan argumen melalui pushNamed dilakukan dengan parameter arguments: Object?. Layar penerima mengekstrak argumen melalui ModalRoute.of(context)!.settings.arguments, yang memastikan transfer data yang aman secara tipe tanpa variabel global atau InheritedWidget.

Penanganan rute tidak dikenal

Properti onUnknownRoute di MaterialApp menangani kasus ketika pushNamed dipanggil dengan rute yang tidak ada. Ini berguna untuk menampilkan layar 404 atau mengarahkan ke halaman utama. Dalam kombinasi dengan onGenerateRoute, ini memastikan cakupan lengkap dari semua kemungkinan skenario navigasi.

Navigator 2.0 (juga dikenal sebagai Router API) — adalah pendekatan deklaratif untuk navigasi, diperkenalkan di Flutter 2.0. Tidak seperti Navigator 1.0 imperatif di mana pengembang memanggil push/pop, Router mengelola navigasi melalui status, secara otomatis menyinkronkan URL browser dengan layar saat ini. Ini sangat penting untuk aplikasi web dan versi desktop.

Arsitektur Navigator 2.0 terdiri dari tiga komponen utama: RouteInformationParser mengurai URL menjadi konfigurasi rute, RouterDelegate mengubah konfigurasi menjadi daftar Route, dan BackButtonDispatcher menangani tombol sistem “Kembali”. Arsitektur semacam itu membuat navigasi sepenuhnya dapat diprediksi dan diuji.

Untuk menyederhanakan pekerjaan dengan Navigator 2.0, ada paket wrapper: go_router (direkomendasikan oleh Google), auto_route, dan beamer. go_router menyediakan DSL deklaratif untuk mendefinisikan rute dengan dukungan untuk navigasi bersarang, pengalihan, dan tautan dalam tanpa implementasi manual RouterDelegate. Menurut pub.dev (2026), go_router digunakan dalam 35% proyek Flutter baru yang lebih memilih pendekatan deklaratif.

Mari kita lihat contoh Navigator dengan rute bernama dan transfer data antar layar. Kode mendemonstrasikan layar daftar produk, transisi ke layar detail, dan kembali dengan hasil.

dart
// Konfigurasi rute di MaterialApp
MaterialApp(
  initialRoute: '/',
  onGenerateRoute: (RouteSettings settings) {
    if (settings.name == '/') {
      return MaterialPageRoute(
        builder: (context) => const ProductListPage(),
      );
    }
    if (settings.name == '/product') {
      final productId = settings.arguments as String;
      return MaterialPageRoute(
        builder: (context) => ProductDetailPage(productId: productId),
      );
    }
    return MaterialPageRoute(
      builder: (context) => const NotFoundPage(),
    );
  },
)

// Navigasi dengan transfer data
final result = await Navigator.pushNamed(
  context,
  '/product',
  arguments: 'product_42',
);

// Mendapatkan data di layar penerima
final args = ModalRoute.of(context)!.settings.arguments as String;

// Ganti layar setelah login
Navigator.pushReplacementNamed(context, '/home');

// Bersihkan tumpukan ke layar utama
Navigator.pushNamedAndRemoveUntil(
  context,
  '/home',
  (route) => false,
);

Dalam contoh, Navigator.pushNamed meneruskan pengenal produk ke layar detail. Saat kembali melalui Navigator.pop(context, updatedProduct), layar pemanggil menerima data yang diperbarui dalam variabel result. pushReplacementNamed mengganti layar saat ini setelah otorisasi, dan pushNamedAndRemoveUntil dengan kondisi (route) => false membersihkan tumpukan sepenuhnya, mencegah kembali ke layar sebelumnya.

Pertanyaan yang Sering Diajukan

Apa perbedaan antara Navigator 1.0 dan Navigator 2.0?

Navigator 1.0 — API imperatif dengan metode push dan pop, nyaman untuk aplikasi seluler sederhana. Navigator 2.0 — API deklaratif melalui Router, RouterDelegate, dan RouteInformationParser, diperlukan untuk aplikasi web dengan perutean URL, tautan dalam, dan navigasi adaptif. Untuk proyek praktis, disarankan go_router sebagai wrapper sederhana di atas Navigator 2.0.

Bagaimana cara mentransfer data antar layar melalui Navigator?

Data ditransfer melalui argumen arguments di pushNamed atau langsung melalui konstruktor Route. Di layar penerima, data diekstrak melalui ModalRoute.of(context)!.settings.arguments. Untuk mengembalikan data, gunakan Navigator.pop(context, result) — layar pemanggil akan menerima hasil sebagai nilai Future yang dikembalikan dari push.

Mengapa tombol “Kembali” tidak kembali ke layar sebelumnya?

Ini terjadi jika layar saat ini dibuka melalui pushReplacement, yang menghapus Route sebelumnya dari tumpukan. Dalam kasus ini, tidak ada riwayat navigasi, dan tombol “Kembali” menutup aplikasi. Untuk kembali, gunakan push biasa, bukan pushReplacement. Periksa juga bahwa panggilan Navigator.pop ditangani dengan benar di layar saat ini.

Bagaimana cara mencegah kembali ke layar sebelumnya?

Gunakan pushReplacement untuk mengganti layar saat ini dengan yang baru — layar sebelumnya dihapus dari tumpukan dan tidak dapat dikembalikan. Untuk pembersihan riwayat lengkap, gunakan pushAndRemoveUntil dengan kondisi (route) => false. Alternatifnya, Anda dapat menimpa WillPopScope (usang) atau PopScope untuk mencegat tombol sistem “Kembali”.

Apa itu go_router dan kapan menggunakannya?

go_router — adalah paket navigasi deklaratif dari Google, dibangun di atas Navigator 2.0. Ini menyediakan DSL sederhana untuk mendefinisikan rute dengan dukungan untuk bersarang, pengalihan, tautan dalam, dan ShellRoute untuk BottomNavigationBar. Gunakan go_router di proyek baru, terutama jika diperlukan dukungan web atau pola navigasi kompleks dengan rute yang dilindungi.

Ringkasan

  • Navigator — manajer navigasi Flutter, mengelola tumpukan Route dengan metode push, pop, pushReplacement, dan pushAndRemoveUntil
  • Tumpukan LIFO — setiap push menambahkan Route di atas, pop menghapus yang teratas; tumpukan menyimpan riwayat transisi berdasarkan prinsip “masuk terakhir, keluar pertama”
  • pushReplacement — penggantian layar saat ini tanpa kemungkinan kembali, penting untuk skenario login dan orientasi
  • Rute bernama — pushNamed dengan RouteSettings dan onGenerateRoute untuk definisi rute terpusat dengan penerusan argumen
  • Navigator 2.0 — navigasi deklaratif melalui Router, RouterDelegate, dan RouteInformationParser untuk tautan dalam web
  • go_router — wrapper yang direkomendasikan Google di atas Navigator 2.0 dengan DSL sederhana dan dukungan ShellRoute
  • Transfer data — melalui arguments di pushNamed dan mengembalikan hasil melalui Future dari push dengan Navigator.pop(context, value)

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga