Praktikum IV membahas Navigasi & Passing Data pada Flutter. Materi berfokus pada penggunaan Navigator untuk berpindah halaman, konsep Stack, serta pengiriman data antar halaman menggunakan Constructor.
Navigator merupakan widget yang digunakan untuk mengelola perpindahan antar halaman atau route. Mekanismenya bekerja seperti tumpukan kartu. Push digunakan untuk meletakkan halaman baru di bagian paling atas tumpukan, sedangkan Pop digunakan untuk menghapus halaman teratas sehingga aplikasi kembali ke halaman sebelumnya.
Pada proses passing data, halaman tujuan harus menyediakan variabel untuk menampung data yang dikirim dan sebuah Constructor. Variabel biasanya dibuat menggunakan final, sedangkan parameter required digunakan untuk memastikan data wajib diberikan ketika halaman tujuan dibuat.
Dalam praktikum ini, data transaksi seperti title, amount, category, dan date dikirim dari Dashboard menuju halaman Detail Transaksi melalui Constructor. Konsep tersebut membuat halaman detail dapat menampilkan informasi sesuai transaksi yang dipilih.
lib/ ├── main.dart ├── dashboard_screen.dart ├── add_transaction_screen.dart └── transaction_detail_screen.dart
import 'package:flutter/material.dart';
import 'dashboard_screen.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Expense Tracker - Modul 4',
theme: ThemeData(
primarySwatch: Colors.red,
),
home: const DashboardScreen(),
);
}
}
Dengan pengaturan tersebut, ketika aplikasi dijalankan, halaman yang pertama ditampilkan adalah Dashboard.
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const AddTransactionScreen(),
),
);
Ketika tombol tambah ditekan, halaman AddTransactionScreen diletakkan di atas halaman Dashboard pada stack Navigator.
class TransactionDetailScreen extends StatelessWidget {
final String title;
final String amount;
final String category;
final String date;
const TransactionDetailScreen({
super.key,
required this.title,
required this.amount,
required this.category,
required this.date,
});
}
Variabel dibuat menggunakan final karena data diterima melalui Constructor dan halaman detail menggunakan StatelessWidget.
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const TransactionDetailScreen(
title: 'Makan Siang',
amount: '- Rp 50.000',
category: 'Makanan',
date: '13 September 2026',
),
),
);
}
Data pada Constructor akan diterima oleh halaman Detail Transaksi dan ditampilkan sesuai dengan transaksi yang dipilih.
if (_formKey.currentState!.validate()) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Transaksi Berhasil Disimpan!'),
backgroundColor: Colors.green,
),
);
Navigator.pop(context);
}
Navigator.pop menghapus halaman form yang berada di posisi teratas stack sehingga aplikasi kembali ke Dashboard.
final _formKey = GlobalKey<FormState>(); final _titleController = TextEditingController(); final _amountController = TextEditingController();
Sebelum data disimpan, form melakukan validasi untuk memastikan input yang dibutuhkan tidak kosong.
Pada tugas Praktikum IV, ditambahkan satu input baru sebelum tombol Simpan untuk mengisi Tanggal Transaksi. Modul menyediakan dua alternatif implementasi, yaitu menggunakan TextFormField dengan format DD/MM/YYYY atau menggunakan tombol tambahan yang memanggil fungsi showDatePicker. Input tanggal wajib diberikan validasi agar tidak boleh kosong. fileciteturn0file0L323-L329
final _dateController = TextEditingController();
TextFormField(
controller: _dateController,
decoration: const InputDecoration(
labelText: "Tanggal Transaksi",
hintText: "DD/MM/YYYY",
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.calendar_today),
),
validator: (value) {
if (value == null || value.isEmpty) {
return "Tanggal transaksi wajib diisi";
}
return null;
},
)
Future<void> _pickDate() async {
final DateTime? picked = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(2000),
lastDate: DateTime(2100),
);
if (picked != null) {
setState(() {
_dateController.text =
"${picked.day.toString().padLeft(2, '0')}/"
"${picked.month.toString().padLeft(2, '0')}/"
"${picked.year}";
});
}
}
Setelah tanggal dipilih, nilai tanggal dimasukkan ke dalam field dengan format DD/MM/YYYY.
onPressed: () {
if (_formKey.currentState!.validate()) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("Data transaksi berhasil divalidasi"),
),
);
}
}
Dengan validasi tersebut, tanggal yang kosong tidak dapat dianggap sebagai input yang valid.
Berdasarkan praktikum yang telah dilakukan, aplikasi berhasil menerapkan navigasi antar halaman menggunakan Navigator. Pada Dashboard, Navigator.push ini digunakan untuk membuka halaman form transaksi maupun halaman Detail Transaksi. Mekanisme ini membuat halaman baru ditempatkan pada bagian teratas stack Navigator.
Proses passing data berhasil diterapkan pada saat pengguna memilih transaksi di Dashboard. Data berupa judul, nominal, kategori, dan tanggal dikirim ke TransactionDetailScreen melalui Constructor. Halaman detail kemudian menampilkan data sesuai transaksi yang dipilih.
Selain itu, Navigator.pop digunakan pada halaman input transaksi untuk menutup halaman tersebut dan kembali ke Dashboard setelah aksi selesai. Penggunaan push dan pop menunjukkan penerapan konsep Stack dalam navigasi Flutter, yaitu halaman yang terakhir dibuka akan menjadi halaman pertama yang ditutup ketika proses pop dilakukan.
Pada bagian tugas, form dikembangkan dengan menambahkan input Tanggal Transaksi. Modul menyediakan penggunaan TextFormField dengan format DD/MM/YYYY maupun pemilihan tanggal menggunakan showDatePicker. Input tanggal juga diberikan validasi wajib diisi sehingga data tidak dapat diproses apabila tanggal belum diberikan.
Dari praktikum yang telah dilakukan dapat disimpulkan bahwa Flutter menyediakan Navigator untuk mengatur perpindahan antar halaman menggunakan konsep stack. Navigator.push digunakan untuk membuka halaman baru, sedangkan Navigator.pop digunakan untuk kembali ke halaman sebelumnya.
Passing data antar halaman dapat kita lakukan melalui Constructor dengan menyediakan variabel final dan parameter required. Dengan cara tersebut, data transaksi dapat dikirim dari Dashboard menuju halaman Detail Transaksi dan ditampilkan sesuai dengan data yang dipilih pengguna.
Pada tugas praktikum, form juga dikembangkan dengan menambahkan input tanggal transaksi yang wajib diisi. Dengan demikian, aplikasi tidak hanya mampu melakukan navigasi antar halaman, tetapi juga dapat mengirimkan dan menampilkan data transaksi secara lebih lengkap.