Setelah menyelesaikan kedua praktikum ini, mahasiswa diharapkan
mampu:
Memahami kerangka dasar aplikasi Flutter (MaterialApp &
Scaffold)
Membedakan penggunaan StatelessWidget dan StatefulWidget
Menerapkan fungsi setState() untuk membuat UI
interaktif
Menerapkan widget Row untuk menyusun elemen
secara horizontal
Menerapkan widget Column untuk menyusun
daftar/list secara vertikal
Mengatur padding, margin, dan warna menggunakan
Container
Menggunakan ListTile untuk membuat baris daftar
yang rapi
II. Dasar Teori
StatelessWidget tidak menyimpan state yang dapat
diubah di dalam widget tersebut. Tampilannya tetap dapat dibangun
ulang ketika data dari induknya berubah. Contoh: label teks, ikon,
gambar statis.
StatefulWidget memiliki objek
State untuk menyimpan data yang berubah. Ketika data
tersebut diperbarui melalui setState(), Flutter
membangun ulang bagian antarmuka terkait. Contoh: form input,
checkbox, animasi.
Row menyusun widget menyamping (kiri ke kanan),
Column menyusun widget menurun (atas ke bawah),
sedangkan Container adalah kotak yang bisa diatur
margin, padding, dan batasnya.
ListTile adalah widget bawaan Material Design
untuk membuat baris daftar yang rapi secara instan, terdiri dari:
Leading - elemen paling kiri (ikon/avatar)
Title - judul utama baris
Trailing - elemen paling kanan (nominal/tombol)
III. Alat dan Bahan
Laptop / Komputer
Flutter SDK
Code Editor: VS Code atau Android Studio
Emulator / Device
IV. Praktikum Modul 1
MODUL 1 — Pengenalan WidgetsStatelessWidget, StatefulWidget, dan perubahan state
1Membuat Widget Sapaan
Bbuat GreetingWidget sebagai
StatelessWidget karena nama dan kalimat sapaan
belum berubah ketika aplikasi dipakai.
Row menempatkan avatar di samping teks;
Column menyusun dua baris teks. Pemisahan ini
memudahkan widget sapaan dipakai lagi di halaman dashboard.
Gambar 1. Kode GreetingWidget
Sapaan dan ikon profil tampil sejajar, dengan teks kedua berada
di bawah nama. Karena isi sapaan belum memakai data yang
berubah, komponen ini tidak perlu menyimpan state sendiri.
Hasilnya juga tetap mudah dibaca pada layar emulator yang
sempit.
2Membuat Kartu Saldo
Bagian saldo dipisahkan menjadi
BalanceCardWidget. Widget ini memakai
StatefulWidget karena saldo nantinya bisa
ditampilkan atau disamarkan. Variabel
_isBalanceVisible menyimpan kondisi tersebut.
Gambar 2. Struktur BalanceCardWidget
Kartu memiliki data tampilan yang dapat diubah tanpa membangun
ulang seluruh aplikasi. Pemakaian widget terpisah membuat
perilaku saldo tidak bercampur dengan kode sapaan. Ini
memudahkan saya menambahkan tombol mata tanpa mengubah tata
letak bagian lain.
3Mengaktifkan Tombol Mata
Ketika ikon mata ditekan, fungsi
_toggleBalanceVisibility() membalik nilai boolean
di dalam setState(). Flutter lalu membangun ulang
kartu, sehingga ikon dan teks nominal mengikuti nilai terbaru.
Kondisi ternary memilih nominal asli saat true dan
tanda sensor saat false. Logika ini berada di kelas
_BalanceCardWidgetState.
Gambar 3. Tombol mata dan logika setState
Menekan ikon mata mengubah tampilan saldo secara langsung,
menekannya lagi mengembalikan nominal. Perubahan terjadi pada
kartu yang sama, sehingga pengguna tidak berpindah halaman.
4Menggabungkan Widget pada Dashboard
Gabungkan MyApp, DashboardScreen,
GreetingWidget, dan BalanceCardWidget.
MaterialApp menjadi akar aplikasi, sedangkan
Scaffold menyediakan App Bar dan area isi.
Padding memberi jarak dari tepi layar.
Gambar 4. Penyusunan kode dashboard Modul 1
Urutan pada layar adalah App Bar, sapaan, lalu kartu saldo.
Jarak antarkomponen dibuat dengan SizedBox agar tampilan tidak
terlalu rapat.
5Menjalankan dan Memeriksa Tampilan
Aplikasi dijalankan pada emulator Android Studio melalui
terminal VS Code. Setelah layar terbuka, periksa posisi sapaan
dan kartu, lalu tekan ikon mata dua kali untuk memastikan saldo
dapat disembunyikan dan dimunculkan kembali. Perubahan tampilan
inilah bukti bahwa state pada kartu bekerja.
Gambar 5. Tampilan aplikasi setelah Modul 1
Tampilan Modul 1 berhasil muncul di emulator dan tombol mata
merespons ketukan. Pemeriksaan di emulator membantu memastikan
ukuran dan jarak komponen sesuai layar ponsel. S
TUGAS MODUL 1
1Menyamakan Warna App Bar, Avatar, dan Kartu Saldo
Ganti warna tiga area utama menjadi
Colors.teal. Warna App Bar diatur pada properti
backgroundColor, warna lingkaran profil pada
CircleAvatar.backgroundColor, dan warna kartu pada
Card.color.
Gambar 6. Perubahan warna App Bar
Gambar 7. Perubahan warna avatar
Gambar 8. Perubahan warna kartu saldo
Bagian atas halaman, avatar, dan kartu saldo memiliki warna teal
yang senada.
2Menambahkan Nomor Rekening
Tambahkan teks rekening di bawah nominal pada
Column di dalam kartu saldo, sesudah
SizedBox sebagai jarak. Nomor rekening dibuat
sebagai Text biasa karena nilainya tetap. Saat
tombol mata ditekan, hanya nominal yang disensor.
Gambar 9. Kode penambahan nomor rekening
Nomor rekening muncul di bagian bawah kartu dengan warna teks
yang tetap terbaca. Posisinya sengaja diletakkan setelah nominal
agar urutan informasi tetap jelas: nama kartu, saldo, lalu
rekening. Teks yang lebih kecil menjaga perhatian utama tetap
berada pada jumlah saldo.
Hasil tugas Modul 1
Gambar 10. Hasil tugas Modul 1 pada emulator
Pada emulator, warna teal terlihat pada App Bar, avatar, dan
kartu saldo. Teks rekening tetap tampil ketika nominal
disembunyikan.
V. Praktikum Modul 2 (Lanjutan)
MODUL 2 - Layouting & StylingRow, Column, Container, ListTile, dan area gulir
1Menyusun Tombol Aksi
Tiga aksi diletakkan dalam satu Row agar berjajar
mendatar. mainAxisAlignment.spaceEvenly membagi
ruang secara merata. Setiap aksi terdiri dari ikon di dalam
Container dan label di bawahnya. Fungsi
_buildActionButton menjaga ukuran, jarak, dan
bentuk ketiganya tetap konsisten. Pada tahap ini widget dibuat
sebagai tampilan mockup, belum ada fungsi transaksi ketika
ditekan.
Gambar 11. Kode ActionButtonsWidget
Pemasukan, Pengeluaran, dan Transfer tampil sejajar dengan gaya
ikon yang seragam. Ketiga ikon dibuat dari fungsi pembantu yang
sama sehingga perbedaan label dan warna tidak mengubah ukuran
tampilannya. P
2Menyusun Daftar Transaksi
Letakkan judul dan kartu transaksi dalam
Column. Setiap ListTile membagi
informasi menjadi ikon (leading), nama
(title), tanggal (subtitle), serta
jumlah (trailing). Divider membantu
memisahkan transaksi agar mudah dibaca.
Gambar 12. Kode daftar transaksi awal
Riwayat awal berisi Makan Siang, Gaji Bulanan, dan Isi Bensin.
Setiap transaksi memakai susunan informasi yang sama, jadi
pembaca bisa membandingkan nama, tanggal, dan jumlah dengan
cepat.
3Menggabungkan Layout dan Mengaktifkan Scroll
Isi body pada DashboardScreen saya
ubah menjadi SingleChildScrollView yang membungkus
satu Column. Dengan susunan ini, seluruh widget
dari dua modul berada dalam satu halaman. Saat daftar transaksi
bertambah dan tinggi konten melebihi layar emulator, halaman
bisa discroll sehingga bagian bawah tetap dapat dilihat.
Gambar 13. Integrasi semua widget dalam dashboard
Komponen tampil berurutan tanpa bagian bawah terpotong saat
konten memanjang.
4Memeriksa Hasil Modul 2
Gambar 14. Tampilan dashboard setelah Modul 2
Dashboard menampilkan sapaan, kartu saldo, tiga aksi, dan
riwayat transaksi dalam satu layar yang dapat discroll.
TUGAS MODUL 2
1Membedakan Warna Nominal Transaksi
Beri warna merah pada jumlah yang bertanda minus karena itu
pengeluaran, sedangkan jumlah bertanda plus diberi warna hijau
karena itu pemasukan. Perubahan dilakukan pada
Text di properti trailing tiap
ListTile, sehingga nama dan tanggal transaksi tidak
ikut berubah warna. Perbedaan ini membantu pembaca mengenali
arus uang dengan cepat.
Gambar 15. Kode nominal pengeluaran
Gambar 16. Kode nominal pemasukan
Nominal transaksi keluar dan masuk dapat dibedakan dari tanda
serta warnanya. Warna dipakai sebagai petunjuk tambahan,
sedangkan tanda plus dan minus tetap dipertahankan agar maknanya
jelas. Dengan begitu, jenis transaksi masih dapat dikenali
meskipun warna layar tidak terlihat sempurna.
2Menambahkan Dua Transaksi Fiktif
Tambahkan dua ListTile di akhir daftar, setelah
tiga data awal, dan menaruh Divider sebelum tiap
item baru. Belanja Bulanan dicatat sebagai pengeluaran
sehingga nilainya merah dan bertanda minus.
Bonus Freelance dicatat sebagai pemasukan sehingga
nilainya hijau dan bertanda plus. Karena halaman sudah memakai
SingleChildScrollView, kedua item tetap bisa
dilihat dengan menggulir ke bawah.
Gambar 17. Kode transaksi Belanja Bulanan
Gambar 18. Kode transaksi Bonus Freelance
Jumlah transaksi bertambah dari tiga menjadi lima baris. S
Hasil tugas Modul 2
Gambar 19. Hasil akhir tugas Modul 2 pada emulator
Dashboard akhir menampilkan lima transaksi. Dua transaksi baru
mengikuti susunan yang sama dengan data awal, sementara warna
nominal menunjukkan apakah nilainya pemasukan atau pengeluaran.
Halaman tetap dapat digulir sampai transaksi paling bawah. Kartu
saldo, warna teal, dan nomor rekening dari Modul 1 juga tetap
ada pada hasil akhir ini.
VI. Hasil dan Pembahasan
Modul 1 menghasilkan dua komponen dengan sifat berbeda: sapaan
yang tetap dan kartu saldo yang berubah saat pengguna menekan
tombol mata. Pada Modul 2, komponen tersebut dipakai kembali lalu
ditambah tiga aksi dan daftar transaksi. Pemisahan widget membuat
setiap bagian memiliki tugas yang jelas, sehingga perubahan pada
daftar transaksi tidak perlu mengubah logika kartu saldo.
Penggunaan SingleChildScrollView menjadi penting
setelah transaksi bertambah. Tanpa gulir,
Column dapat melewati tinggi layar emulator dan
menimbulkan overflow. Dengan area gulir, semua transaksi tetap
dapat diakses.
Komponen
Jenis
Peran pada dashboard
GreetingWidget
StatelessWidget
Menampilkan avatar dan sapaan tetap
BalanceCardWidget
StatefulWidget
Menyimpan status tampil atau sensor saldo
ActionButtonsWidget
StatelessWidget
Menyusun tiga ikon aksi secara horizontal
RecentTransactionsWidget
StatelessWidget
Menampilkan daftar transaksi dalam ListTile
VII. Kesimpulan
Dari kedua praktikum, dapat dipahami bahwa jenis widget dipilih
berdasarkan kebutuhan perubahan data. Sapaan cukup memakai
StatelessWidget, sedangkan kartu saldo memerlukan
StatefulWidget dan setState() agar dapat
merespons tombol mata. Row dan
Column menyusun komponen sesuai arah yang diperlukan,
ListTile merapikan informasi transaksi, dan
SingleChildScrollView menjaga seluruh daftar tetap
dapat dijangkau saat isinya bertambah.
Semua langkah berhasil dijalankan dan output sesuai yang
diharapkan.
Lihat Repository GitHub