Laprak 2 - Widgets, Layouting & Styling

Praktikum Aplikasi Mobile Pertemuan 2 Zahran Azaria Anvaya - 2411531005

I. Tujuan Praktikum

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
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
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
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
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
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 6. Perubahan warna App Bar
Gambar 7. Perubahan warna avatar
Gambar 7. Perubahan warna avatar
Gambar 8. Perubahan warna kartu saldo
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
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
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
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
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
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
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 15. Kode nominal pengeluaran
Gambar 16. Kode nominal pemasukan
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 17. Kode transaksi Belanja Bulanan
Gambar 18. Kode transaksi Bonus Freelance
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
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