Membuat Aplikasi Kalkulator Interaktif dengan Kotlin dan Jetpack Compose
Nama : Iftala Zahri Sukmana
NRP : 5025221002
Kelas : H
Link GitHub : https://github.com/ifzahri/ppb/tree/main/Calculator
Persiapan
Sebelum mulai, pastikan kamu sudah menginstal Android Studio versi terbaru dan telah membuat proyek Android baru dengan dukungan Jetpack Compose. Selanjutnya, kita siap untuk memulai coding!
Struktur Aplikasi
Kalkulator kita akan memiliki komponen-komponen berikut:
- Dua TextField untuk input nilai A dan B
- Empat tombol untuk operasi: Tambah, Kurang, Kali, dan Bagi
- Area untuk menampilkan hasil perhitungan
Implementasi Kode
MainActivity.kt
Pertama, mari kita buat file MainActivity.kt yang akan menjadi pusat aplikasi kita:
package com.example.simplecalculator
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
CalculatorApp()
}
}
}
Komponen Utama Aplikasi Kalkulator
Selanjutnya, kita buat fungsi CalculatorApp() yang akan menampilkan UI utama aplikasi:
@Composable
fun CalculatorApp() {
var valueA by remember { mutableStateOf("") }
var valueB by remember { mutableStateOf("") }
var result by remember { mutableStateOf("") }
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Text(
text = "Kalkulator Sederhana",
fontSize = 24.sp,
modifier = Modifier.padding(bottom = 24.dp)
)
TextField(
value = valueA,
onValueChange = { valueA = it },
label = { Text("Nilai A") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
modifier = Modifier.fillMaxWidth()
)
TextField(
value = valueB,
onValueChange = { valueB = it },
label = { Text("Nilai B") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
modifier = Modifier.fillMaxWidth()
)
Text(
text = "Hasil: $result",
fontSize = 20.sp,
modifier = Modifier.padding(vertical = 16.dp)
)
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceEvenly
) {
AddButton(valueA, valueB) { result = it }
SubButton(valueA, valueB) { result = it }
}
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceEvenly
) {
MulButton(valueA, valueB) { result = it }
DivButton(valueA, valueB) { result = it }
}
}
}
}
Implementasi Tombol Operasi
Sekarang kita buat empat fungsi Composable untuk setiap tombol operasi:
@Composable
fun AddButton(valueA: String, valueB: String, onResult: (String) -> Unit) {
Button(
onClick = {
try {
val a = valueA.toDouble()
val b = valueB.toDouble()
onResult((a + b).toString())
} catch (e: NumberFormatException) {
onResult("Input tidak valid")
}
},
modifier = Modifier.padding(8.dp)
) {
Text(text = "+")
}
}
@Composable
fun SubButton(valueA: String, valueB: String, onResult: (String) -> Unit) {
Button(
onClick = {
try {
val a = valueA.toDouble()
val b = valueB.toDouble()
onResult((a - b).toString())
} catch (e: NumberFormatException) {
onResult("Input tidak valid")
}
},
modifier = Modifier.padding(8.dp)
) {
Text(text = "-")
}
}
@Composable
fun MulButton(valueA: String, valueB: String, onResult: (String) -> Unit) {
Button(
onClick = {
try {
val a = valueA.toDouble()
val b = valueB.toDouble()
onResult((a * b).toString())
} catch (e: NumberFormatException) {
onResult("Input tidak valid")
}
},
modifier = Modifier.padding(8.dp)
) {
Text(text = "×")
}
}
@Composable
fun DivButton(valueA: String, valueB: String, onResult: (String) -> Unit) {
Button(
onClick = {
try {
val a = valueA.toDouble()
val b = valueB.toDouble()
if (b == 0.0) {
onResult("Tidak bisa dibagi dengan nol")
} else {
onResult((a / b).toString())
}
} catch (e: NumberFormatException) {
onResult("Input tidak valid")
}
},
modifier = Modifier.padding(8.dp)
) {
Text(text = "÷")
}
}
Penjelasan Kode
State Management
Dalam Jetpack Compose, kita menggunakan mutableStateOf untuk mengelola state aplikasi. Kita membuat tiga state:
valueA: untuk menyimpan input pertamavalueB: untuk menyimpan input keduaresult: untuk menyimpan hasil perhitungan
var valueA by remember { mutableStateOf("") }
var valueB by remember { mutableStateOf("") }
var result by remember { mutableStateOf("") }
Penanganan Input
Setiap TextField terhubung ke state terkait melalui parameter value dan onValueChange:
TextField(
value = valueA,
onValueChange = { valueA = it },
label = { Text("Nilai A") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
modifier = Modifier.fillMaxWidth()
)
Kita juga mengatur keyboardType ke KeyboardType.Number agar keyboard numerik ditampilkan saat pengguna menekan TextField.
Operasi Matematika
Setiap tombol operasi memiliki logika yang serupa:
- Mengambil nilai dari
valueAdanvalueB - Mengkonversi string ke double
- Melakukan operasi matematika
- Mengembalikan hasil ke state
result - Menangani kesalahan (seperti input tidak valid atau pembagian dengan nol)
Contoh untuk tombol tambah:
@Composable
fun AddButton(valueA: String, valueB: String, onResult: (String) -> Unit) {
Button(
onClick = {
try {
val a = valueA.toDouble()
val b = valueB.toDouble()
onResult((a + b).toString())
} catch (e: NumberFormatException) {
onResult("Input tidak valid")
}
},
modifier = Modifier.padding(8.dp)
) {
Text(text = "+")
}
}
Konfigurasi Gradle
Jangan lupa untuk mengatur build.gradle agar mendukung Jetpack Compose:
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
namespace 'com.example.simplecalculator'
compileSdk 34
defaultConfig {
applicationId "com.example.simplecalculator"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion '1.4.3'
}
packaging {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.10.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
implementation 'androidx.activity:activity-compose:1.7.2'
implementation platform('androidx.compose:compose-bom:2023.03.00')
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.ui:ui-graphics'
implementation 'androidx.compose.ui:ui-tooling-preview'
implementation 'androidx.compose.material3:material3'
// ... dependencies lainnya
}
Hasil Akhir
Setelah mengimplementasikan semua kode di atas, kamu akan memiliki aplikasi kalkulator interaktif yang berfungsi penuh dengan tampilan bersih dan modern. Aplikasi ini memungkinkan pengguna untuk:
- Memasukkan dua angka (A dan B)
- Melakukan operasi penjumlahan, pengurangan, perkalian, dan pembagian
- Melihat hasil perhitungan dengan cepat
- Mendapatkan pesan kesalahan jika input tidak valid atau mencoba membagi dengan no


Komentar
Posting Komentar