Pertemuan 6 - 01/04/2026
Pada pertemuan keenam ini, kami membuat aplikasi Kalkulator Sederhana menggunakan Kotlin dan Jetpack Compose di Android Studio. Aplikasi ini memiliki dua OutlinedTextField untuk input angka, empat tombol operator (+, -, *, /), serta teks hasil yang ditampilkan secara reaktif. Konsep utama yang dipelajari adalah pengelolaan State dengan remember dan mutableStateOf, validasi input dengan toDoubleOrNull(), dan penggunaan ekspresi when untuk logika perhitungan.
com.example.simplecalculator, dan Minimum SDK API 24.remember { mutableStateOf("") }, yaitu num1, num2 untuk menyimpan input angka, dan result untuk menyimpan hasil perhitungan.toDoubleOrNull(), menghitung menggunakan ekspresi when, dan menangani kasus pembagian dengan nol serta input tidak valid.keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number) agar keyboard numerik muncul otomatis saat field disentuh.if (result.isNotEmpty()) sehingga hanya muncul setelah tombol operator pertama kali ditekan.for (op in listOf("+", "-", "*", "/")) agar kode lebih ringkas. Setiap tombol memanggil calculate(op) saat ditekan.verticalArrangement = Arrangement.Center, dan horizontalAlignment = Alignment.CenterHorizontally agar semua elemen berada di tengah layar.Menyimpan state UI agar tidak reset saat recomposition dan memicu pembaruan UI otomatis ketika nilainya berubah.
Komponen input teks Material3 dengan border outline, mendukung onValueChange untuk memperbarui state setiap karakter diketik.
Konversi String ke Double yang aman — mengembalikan null jika input bukan angka, mencegah aplikasi crash.
Ekspresi Kotlin yang memetakan operator ke operasi aritmatika yang sesuai, dapat mengembalikan nilai langsung ke variabel.
Opsi keyboard yang membuat HP menampilkan keyboard angka secara otomatis saat OutlinedTextField difokus.
Pengecekan if (n2 != 0.0) sebelum operasi bagi untuk mencegah error dan menampilkan pesan yang informatif.
package com.example.simplecalculator import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Button import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.example.simplecalculator.ui.theme.SimpleCalculatorTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { SimpleCalculatorTheme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> CalculatorApp( modifier = Modifier.padding(innerPadding) ) } } } } } @Composable fun CalculatorApp(modifier: Modifier = Modifier) { var num1 by remember { mutableStateOf("") } var num2 by remember { mutableStateOf("") } var result by remember { mutableStateOf("") } fun calculate(operator: String) { val n1 = num1.toDoubleOrNull() val n2 = num2.toDoubleOrNull() if (n1 == null || n2 == null) { result = "Input tidak valid" return } result = when (operator) { "+" -> (n1 + n2).toString() "-" -> (n1 - n2).toString() "*" -> (n1 * n2).toString() "/" -> if (n2 != 0.0) (n1 / n2).toString() else "Error: Tidak bisa dibagi nol" else -> "Operator tidak valid" } } Column( modifier = modifier .fillMaxSize() .padding(24.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { OutlinedTextField( value = num1, onValueChange = { num1 = it }, label = { Text("Angka pertama") }, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Number ), modifier = Modifier.fillMaxWidth() ) Spacer(modifier = Modifier.height(12.dp)) OutlinedTextField( value = num2, onValueChange = { num2 = it }, label = { Text("Angka kedua") }, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Number ), modifier = Modifier.fillMaxWidth() ) Spacer(modifier = Modifier.height(16.dp)) if (result.isNotEmpty()) { Text( text = "Hasil: ", fontSize = 20.sp, fontWeight = FontWeight.SemiBold ) Spacer(modifier = Modifier.height(16.dp)) } Row( horizontalArrangement = Arrangement.spacedBy(8.dp) ) { for (op in listOf("+", "-", "*", "/")) { Button(onClick = { calculate(op) }) { Text(text = op, fontSize = 18.sp) } } } } } @Preview(showBackground = true) @Composable fun CalculatorPreview() { SimpleCalculatorTheme { CalculatorApp() } }
Komentar
Posting Komentar