← Kembali ke Portfolio
Praktikum Aplikasi Mobile

Laporan Praktikum 3
Input Widgets & Forms: Menangkap Data, Dropdown, dan Validasi

Sasya Zamora  ·  2411533014  ·  Informatika – Universitas Andalas  ·  2025/2026

Dosen Pengampu: Nurfiah, S.ST., M.Kom

1 Pendahuluan

Pada hampir semua aplikasi mobile, form input adalah bagian yang tidak bisa dihindari, misalnya form login, form registrasi, atau form pencatatan transaksi seperti yang dikerjakan pada praktikum ini. Oleh karena itu, penting bagi saya untuk memahami cara menangkap data dari pengguna menggunakan controller, menampilkan pilihan lewat dropdown, serta menerapkan validasi agar data yang masuk ke sistem tidak kosong atau salah format.

Pada praktikum ini, saya membuat halaman AddTransactionScreen yang berisi input Judul Transaksi, Nominal, dan Kategori (dropdown), lengkap dengan validasi pada masing-masing kolom. Selain itu, terdapat pula tugas tambahan untuk menambahkan input Tanggal Transaksi menggunakan fungsi showDatePicker, yang juga dibahas pada laporan ini.

2 Tujuan Praktikum

Tujuan yang ingin dicapai dari praktikum ini adalah:

  • Mampu menangkap data teks yang diketik pengguna melalui TextEditingController.
  • Mampu menerapkan widget dropdown statis menggunakan DropdownButtonFormField.
  • Mampu menerapkan validasi input untuk mencegah data kosong atau format yang salah sebelum data disimpan ke dalam sistem.
3 Langkah-Langkah Praktikum
1 Membuat File add_transaction_screen.dart

Langkah pertama adalah membuat file baru bernama add_transaction_screen.dart di dalam folder lib/. File ini akan berisi seluruh kode tampilan dan logika form pencatatan transaksi.

2 Persiapan State dan Controller

Karena isi formulir (teks dan pilihan dropdown) akan terus berubah setiap kali pengguna mengetik atau memilih opsi, maka widget yang digunakan adalah StatefulWidget. Saya menyiapkan sebuah GlobalKey<FormState> untuk mengontrol dan memicu validasi seluruh Form, serta dua buah TextEditingController untuk membaca input Judul Transaksi dan Nominal. Controller yang sudah dibuat juga wajib dibersihkan (dispose) saat halaman ditutup agar tidak terjadi memory leak.

Gambar 1. Cuplikan kode deklarasi GlobalKey, TextEditingController, dan dispose()
Gambar 1. Cuplikan kode deklarasi GlobalKey, TextEditingController, dan dispose() pada add_transaction_screen.dart
3 Membuat Kolom Input (TextFormField)

Seluruh kolom input dibungkus dengan widget Form dan dihubungkan dengan _formKey yang sudah disiapkan sebelumnya. Kolom Judul Transaksi divalidasi agar tidak boleh kosong, sedangkan kolom Nominal menggunakan keyboardType: TextInputType.number agar keyboard yang muncul otomatis berupa angka, dan validasinya memastikan nilai tersebut wajib diisi serta harus berupa angka yang valid.

Gambar 2. Cuplikan kode TextFormField Judul Transaksi dan Nominal
Gambar 2. Cuplikan kode TextFormField untuk Judul Transaksi dan Nominal beserta validatornya
4 Dropdown Kategori dan Tombol Simpan

Untuk pilihan kategori transaksi, saya menggunakan DropdownButtonFormField dengan empat opsi statis, yaitu Makanan, Transportasi, Hiburan, dan Lainnya. Setelah semua kolom terisi, tombol Simpan Transaksi akan memanggil _formKey.currentState!.validate() yang secara otomatis menjalankan validator pada seluruh kolom form sekaligus. Jika semua kolom valid, aplikasi akan menampilkan SnackBar berwarna hijau sebagai tanda transaksi berhasil disimpan.

Gambar 3. Cuplikan kode DropdownButtonFormField dan ElevatedButton Simpan Transaksi
Gambar 3. Cuplikan kode DropdownButtonFormField Kategori dan ElevatedButton Simpan Transaksi
5 Hasil Pengujian Form Dasar

Setelah kode dijalankan, tampilan halaman Catat Transaksi Baru berhasil muncul sesuai rancangan pada modul. Terlihat kolom Judul Transaksi terisi "makan malam", kolom Nominal terisi "50.000", serta dropdown Kategori menampilkan pilihan "Makanan" dengan tema warna ungu (deepPurple) pada AppBar dan tombol Simpan Transaksi.

Gambar 4. Tampilan awal form Catat Transaksi Baru
Gambar 4. Tampilan awal form Catat Transaksi Baru (hasil menjalankan aplikasi)
4 Latihan / Tugas: Input Tanggal Transaksi

Sesuai instruksi pada modul bagian 1.5, saya menambahkan satu input baru sebelum tombol Simpan, yaitu kolom Tanggal Transaksi. Kolom ini wajib diisi dan pengisiannya dilakukan melalui fungsi showDatePicker, bukan diketik manual.

1 Modifikasi Kode

Saya menambahkan sebuah TextEditingController baru (_dateController) khusus untuk menampung tanggal yang dipilih, serta sebuah fungsi asinkron _pilihTanggal() yang memanggil showDatePicker bawaan Flutter. Hasil tanggal yang dipilih pengguna kemudian diformat secara manual menjadi bentuk DD/MM/YYYY sebelum dimasukkan ke dalam controller.

Gambar 5. Cuplikan kode fungsi _pilihTanggal()
Gambar 5. Cuplikan kode fungsi _pilihTanggal() yang memanggil showDatePicker

Kolom TextFormField untuk tanggal dibuat bersifat readOnly agar pengguna tidak bisa mengetik manual dan tetap harus memilih lewat kalender, baik dengan menekan tombol ikon (+) pada suffixIcon maupun dengan menyentuh (tap) area kolom itu sendiri. Validator pada kolom ini memastikan tanggal wajib diisi sebelum form dapat disimpan.

Gambar 6. Cuplikan kode TextFormField Tanggal Transaksi
Gambar 6. Cuplikan kode TextFormField Tanggal Transaksi beserta validatornya
2 Hasil Pengujian Fitur Tanggal

Ketika tombol (+) pada kolom Tanggal Transaksi ditekan, showDatePicker bawaan Flutter berhasil muncul dalam bentuk kalender, menampilkan bulan September 2026 dengan tanggal hari ini (25 September) tersorot berwarna ungu sebagai default pilihan.

Gambar 7. Date picker terbuka
Gambar 7. Date picker terbuka saat tombol (+) pada kolom Tanggal Transaksi ditekan

Setelah tanggal dipilih (26 September 2026) dan tombol OK ditekan, nilai tanggal otomatis terisi ke dalam kolom dengan format DD/MM/YYYY, yaitu "26/09/2026", sesuai dengan format yang diminta pada instruksi latihan.

Gambar 8. Kolom Tanggal Transaksi terisi otomatis
Gambar 8. Kolom Tanggal Transaksi terisi otomatis setelah tanggal dipilih

Terakhir, saat seluruh kolom (Judul, Nominal, Tanggal, dan Kategori) sudah terisi dengan benar dan tombol Simpan Transaksi ditekan, validasi berhasil dilewati oleh semua kolom sehingga muncul SnackBar hijau di bagian bawah layar bertuliskan "Tersimpan: makan malam (Rp 50000) - 26/09/2026". Hal ini membuktikan bahwa validator pada kolom tanggal yang baru ditambahkan sudah berjalan sebagaimana mestinya, karena form tidak akan lolos apabila kolom tanggal masih kosong.

Gambar 9. Transaksi berhasil disimpan
Gambar 9. Transaksi berhasil disimpan setelah seluruh kolom termasuk tanggal terisi dan tervalidasi
5 Pembahasan

Dari hasil pengujian yang telah dilakukan, seluruh validator pada form berjalan sesuai dengan yang diharapkan. Ketika salah satu kolom seperti Judul, Nominal, atau Tanggal masih kosong, tombol Simpan Transaksi tidak akan berhasil menjalankan aksi simpan karena _formKey.currentState!.validate() akan mengembalikan nilai false. Sebaliknya, ketika seluruh kolom sudah terisi dengan benar, validasi akan lolos dan SnackBar konfirmasi berwarna hijau akan muncul.

Penambahan input Tanggal Transaksi pada bagian latihan juga menunjukkan bahwa konsep Form dan GlobalKey pada Flutter cukup fleksibel, karena kolom baru dapat ditambahkan ke dalam Form yang sama tanpa perlu mengubah logika validasi kolom-kolom yang sudah ada sebelumnya. Selain itu, penggunaan showDatePicker jauh lebih baik dibandingkan pengguna mengetik tanggal secara manual, karena format tanggal yang dihasilkan pasti konsisten dan terhindar dari kesalahan penulisan.

Sebagai catatan tambahan, file add_transaction_screen.dart yang berisi form ini juga sudah dihubungkan dengan halaman Dashboard hasil Praktikum II melalui import pada main.dart, di mana tombol Pemasukan/Pengeluaran serta sebuah FloatingActionButton "Catat Transaksi" pada Dashboard akan mengarahkan pengguna langsung menuju halaman AddTransactionScreen ini menggunakan Navigator.push.

Gambar 10. Cuplikan kode FloatingActionButton pada DashboardScreen
Gambar 10. Cuplikan kode FloatingActionButton pada DashboardScreen (main.dart) yang membuka AddTransactionScreen
Gambar 11. Cuplikan kode _buildActionButton
Gambar 11. Cuplikan kode _buildActionButton yang juga diarahkan membuka AddTransactionScreen
6 Kesimpulan

Berdasarkan praktikum yang telah dilakukan, dapat disimpulkan bahwa form input pada Flutter dapat dibangun dengan memadukan beberapa komponen utama, yaitu Form dan GlobalKey, TextFormField, serta TextEditingController sehingga beberapa input dapat divalidasi dalam satu kesatuan. Validasi berhasil diterapkan pada seluruh kolom form, yaitu Judul, Nominal, Tanggal, dan Kategori, untuk mencegah data kosong maupun format yang tidak sesuai sebelum data disimpan. Selain itu, DropdownButtonFormField berhasil digunakan untuk menyediakan pilihan kategori transaksi yang bersifat statis. Input Tanggal Transaksi juga berhasil ditambahkan menggunakan showDatePicker, lengkap dengan validasi wajib diisi, dan telah diuji coba dengan hasil yang sesuai. Melalui praktikum ini, saya menjadi lebih memahami cara membuat form input dan pentingnya validasi data dalam pengembangan aplikasi mobile agar data yang dimasukkan pengguna tetap sesuai dan dapat diproses dengan baik.