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.