Lompat ke konten utama
←

Flutter Dasar: Dart, Widget, dan State

Pelajaran 12 dari 18

State, navigasi, dan formulir

Navigasi: pindah layar sambil membawa data

Setelah pelajaran ini kamu bisa menelusuri tumpukan route saat push dan pop, mengirim data lewat konstruktor layar tujuan, dan menerima hasil dari layar yang ditutup.

  • ±13 menit
  • 3 latihan
  • Diperiksa 28 Okt 2026

Latihan di pelajaran ini butuh akun gratis. Progres, kode, dan catatanmu hanya tersimpan di browser ini. Masuk untuk menyimpannya

Materi

Di Flutter, setiap layar disebut route, dan route hanyalah widget; di Android route setara dengan Activity, di iOS setara dengan ViewController. Navigator menyimpan route dalam tumpukan. Navigator.push(context, MaterialPageRoute(builder: (context) => const LayarDetail())) menaruh route baru di puncak tumpukan, sehingga layar itu tampil dengan animasi perpindahan khas platform. Navigator.pop(context) membuang route paling atas, sehingga layar di bawahnya tampil kembali. Push tidak mengganti layar lama; layar lama tetap ada di bawahnya.

class LayarPesanan extends StatelessWidget {
  const LayarPesanan({super.key, required this.nomorMeja});

  final int nomorMeja;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Meja $nomorMeja')),
      body: Center(
        child: ElevatedButton(
          onPressed: () => Navigator.pop(context, 'lunas'), // mengembalikan hasil
          child: const Text('Tandai lunas'),
        ),
      ),
    );
  }
}

// Di layar daftar meja:
Future<void> _buka(BuildContext context, int meja) async {
  final hasil = await Navigator.push(
    context,
    MaterialPageRoute<String>(builder: (context) => LayarPesanan(nomorMeja: meja)),
  );
  if (!context.mounted) return;
  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Meja $meja: $hasil')));
}

Data dikirim ke layar baru seperti ke widget mana pun: lewat parameter konstruktor yang ditandai required. Untuk menerima hasil, layar pemanggil menunggu Future dari Navigator.push dengan await. Future itu selesai saat layar tujuan memanggil Navigator.pop(context, hasil), dan nilainya adalah hasil tersebut. Baris sesudah await baru berjalan setelah layar tujuan ditutup.

Layar tujuan tidak perlu tahu dari mana datanya berasal; ia cukup menyatakan apa yang dibutuhkannya di konstruktor. Karena parameternya required, analyzer menolak MaterialPageRoute yang membangun layar itu tanpa argumen, sehingga lupa mengirim data ketahuan sebelum aplikasi berjalan.

Latihan

0/3 lulus

Jawaban diperiksa di server. Lulus berarti kamu memahami contohnya, bukan penilaian seluruh pekerjaanmu.

Latihan 1 dari 3

Aplikasi dibuka di Beranda. Pengguna membuka Produk (push), lalu Detail (push), menekan tombol yang memanggil Navigator.pop, lalu membuka Keranjang (push). Apa isi tumpukan dari bawah ke atas?

Pilih satu jawaban

Latihan 2 dari 3

onTap mana yang membuka detail produk yang diketuk?

class LayarDetail extends StatelessWidget {
  const LayarDetail({super.key, required this.produk});

  final Produk produk;

  @override
  Widget build(BuildContext context) {
    return Scaffold(appBar: AppBar(title: Text(produk.nama)));
  }
}

// Di layar daftar:
ListView.builder(
  itemCount: daftar.length,
  itemBuilder: (context, i) => ListTile(
    title: Text(daftar[i].nama),
    onTap: /* ... */,
  ),
)
Pilih satu jawaban

Latihan 3 dari 3

Pengguna menjalankan _pilih, lalu menekan tombol Ambil di toko. Apa yang dicetak?

class PilihPengiriman extends StatelessWidget {
  const PilihPengiriman({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(children: [
        ElevatedButton(
          onPressed: () => Navigator.pop(context, 'kurir'),
          child: const Text('Kirim ke alamat'),
        ),
        ElevatedButton(
          onPressed: () => Navigator.pop(context, 'ambil'),
          child: const Text('Ambil di toko'),
        ),
      ]),
    );
  }
}

// Di layar keranjang:
Future<void> _pilih(BuildContext context) async {
  final metode = await Navigator.push(
    context,
    MaterialPageRoute<String>(builder: (context) => const PilihPengiriman()),
  );
  print('Metode: $metode');
}
Pilih satu jawaban

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Lanjutkan ke