ETS PPB C 2026
Nama Kelompok : Moch Septian Ezra M - 5025231120
Muhammad Shafa Narariya - 5025231016
Kelas : PPB (C)
Link Source Code: https://github.com/arzeee/MyMoney-Notes-Smart-Expense-Tracker
Link Video: https://drive.google.com/file/d/1weyYAgraqq5foiuruDrk8J2owasL7lHj/view?usp=sharing
1. Logika Saldo Otomatis (ViewModel)
fun getTotalBalance(): Double {
return _transactions.value.sumOf {
if (it.type == TransactionType.PEMASUKAN) it.amount else -it.amount
}
}
Penjelasan: Fungsi ini menggunakan sumOf. Ia akan mengecek setiap transaksi: jika tipenya PEMASUKAN maka nilainya positif, jika PENGELUARAN maka nilainya negatif. Hasil akhirnya adalah saldo bersih yang tampil di bagian atas layar kamu.
2. Pengambilan Data Reaktif (StateFlow)
private val _transactions = MutableStateFlow<List<Transaction>>(emptyList())
val transactions: StateFlow<List<Transaction>> = _transactions.asStateFlow()
Penjelasan: StateFlow bertindak seperti aliran air. Begitu fungsi addTransaction dipanggil, "aliran" ini mengirimkan daftar terbaru ke UI (HomeScreen). UI akan mendeteksi perubahan tersebut dan menggambar ulang daftar transaksi secara otomatis (Recomposition).
3. Visualisasi Ringkasan (Pie Chart Canvas)
Canvas(modifier = Modifier.size(100.dp)) {
drawArc(
color = Color(0xFF4CAF50), // Hijau
startAngle = -90f,
sweepAngle = incomeRatio * 360f,
useCenter = true
)
// ... drawArc untuk warna merah
}
Penjelasan: incomeRatio menghitung berapa persen pemasukan dari total uang, lalu dikalikan 360 untuk menentukan seberapa lebar warna hijau di lingkaran tersebut.
4. Daftar yang Efisien (LazyColumn)
LazyColumn(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
items(transactions) { transaction ->
TransactionItem(transaction = transaction)
}
}
Penjelasan: LazyColumn sangat penting untuk performa. Jika kamu punya 1000 transaksi, ia hanya akan memproses transaksi yang terlihat di layar saja. Ini membuat aplikasi tetap ringan dan tidak lag saat di-scroll.
5. Keamanan Input (toDoubleOrNull)
val amountDouble = amount.toDoubleOrNull() ?: 0.0
if (title.isNotBlank() && amountDouble > 0) {
// Simpan data
}
Penjelasan: Karena input dari user berupa teks (String), kita harus mengubahnya ke angka (Double). toDoubleOrNull() memastikan jika user salah ketik (misal mengetik huruf), aplikasi akan memberikan nilai 0.0 alih-alih menutup paksa (force close).
Komentar
Posting Komentar