Episode ini menerapkan Kotlin untuk pengembangan Android: setup project Android dengan Gradle Kotlin DSL, fitur khusus Android seperti extension functions dan ViewBinding, ViewModel dan LiveData bersama coroutines, serta dasar Jetpack Compose yang menulis UI secara deklaratif.

Kotlin dan Android berjalan beriringan sejak 2017. Episode 10 membawa kalian ke dunia Android: setup project dengan Kotlin, fitur-fitur yang membuat pengembangan Android nyaman, arsitektur ViewModel dan LiveData, serta Jetpack Compose yang menulis UI secara deklaratif dengan Kotlin DSL.
Android adalah kasus penggunaan Kotlin paling masif, jadi menguasainya membuka pintu menuju ekosistem dan lowongan yang luas. Meskipun demikian, prinsip yang kalian pelajari — lifecycle, coroutines, dan arsitektur — berlaku juga untuk backend di episode 11.
Di akhir episode ini kalian akan menjalankan aplikasi Android pertama yang menampilkan data secara asinkron dengan pola modern.
Project Android modern memakai Gradle dengan Kotlin DSL. Konfigurasi inti di file build.gradle.kts:
plugins {
id("com.android.application") version "8.5.0" apply false
id("org.jetbrains.kotlin.android") version "2.0.0" apply false
}
android {
namespace = "id.devnull.myapp"
compileSdk = 35
defaultConfig {
applicationId = "id.devnull.myapp"
minSdk = 24
targetSdk = 35
}
kotlinOptions {
jvmTarget = "17"
}
}namespace menentukan package aplikasi, compileSdk mengarahkan level API SDK, dan jvmTarget menyelaraskan bytecode dengan JDK. Project Android dibangun dengan perintah ./gradlew assembleDebug yang menghasilkan APK debug.
Project Android disusun dalam direktori app/src/main untuk kode utama, app/src/androidTest untuk instrumentasi, dan app/src/test untuk unit test lokal. Layout utama: MainActivity.kt sebagai entry point dan AndroidManifest.xml yang mendeklarasikan komponen aplikasi.
Extension functions membuat akses view dan parsing intent lebih ringkas. ViewBinding menggantikan findViewById yang rawan error dengan binding yang aman tipe:
fun Context.showToast(pesan: String) {
Toast.makeText(this, pesan, Toast.LENGTH_SHORT).show()
}Dengan extension function di atas, pemanggilan showToast("Tersimpan") tersedia untuk semua Context di aplikasi. Ekosistem Android memakai pola extension seperti ini sangat luas — dari konversi dp ke pixel sampai akses extra intent.
ViewModel menyimpan data UI yang bertahan dari perubahan konfigurasi, seperti rotasi layar. LiveData adalah observable data holder yang lifecycle-aware:
import androidx.lifecycle.ViewModel
import androidx.lifecycle.MutableLiveData
class MainViewModel : ViewModel() {
private val _jumlah = MutableLiveData(0)
val jumlah: LiveData<Int> = _jumlah
fun tambah() {
_jumlah.value = (_jumlah.value ?: 0) + 1
}
}MutableLiveData untuk menulis di dalam ViewModel, dan LiveData yang read-only untuk dipakai UI. Pemakaian _jumlah.value memakai elvis operator episode 6 untuk nilai awal null.
Panggilan data di Android memakai coroutines dengan viewModelScope — scope otomatis yang dibatalkan saat ViewModel dibersihkan:
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class DataViewModel : ViewModel() {
fun muatData() {
viewModelScope.launch {
val data = withContext(Dispatchers.IO) { repo.ambil() }
tampilkan(data)
}
}
}viewModelScope.launch menjalankan coroutine yang otomatis dibatalkan ketika ViewModel dihancurkan — tidak ada lagi pekerjaan latar yang bocor. withContext(Dispatchers.IO) memindahkan operasi I/O ke thread yang tepat.
Jetpack Compose adalah toolkit UI modern yang menulis antarmuka dengan fungsi Kotlin alih-alih layout XML. Antarmuka dinyatakan sebagai function @Composable:
import androidx.compose.material3.*
@Composable
fun LayarSapaan(nama: String) {
Text(text = "Halo, $nama!", style = MaterialTheme.typography.titleLarge)
}Fungsi LayarSapaan dipanggil dalam hierarki UI dan merender teks. Keadaan yang berubah memicu recomposition otomatis — kalian tidak lagi menulis findViewById dan update manual.
Compose melacak state dengan remember dan mutableStateOf:
import androidx.compose.runtime.*
@Composable
fun Counter() {
var jumlah by remember { mutableStateOf(0) }
Button(onClick = { jumlah++ }) {
Text("Klik: $jumlah")
}
}Saat jumlah berubah, fungsi composable dijalankan ulang dan UI diperbarui. Model deklaratif ini menghapus seluruh kelas bug sinkronisasi antara state dan view yang sering terjadi di Android klasik.
Aplikasi di-build dan dijalankan dengan tooling Gradle dan Android Studio:
./gradlew assembleDebug
./gradlew installDebug
adb logcat --pid=$(adb shell pidof -s id.devnull.myapp)./gradlew installDebug menginstall APK ke emulator atau perangkat yang terhubung, dan adb logcat menampilkan log aplikasi saat runtime. Keduanya menjadi workflow harian pengembang Android.
Episode 10 menerapkan Kotlin di Android: setup project dengan Gradle Kotlin DSL, extension functions dan ViewBinding, arsitektur ViewModel dan LiveData bersama viewModelScope, serta Jetpack Compose yang menulis UI deklaratif dengan Kotlin DSL.
Inti yang harus dibawa pulang:
./gradlew assembleDebug dan installDebug adalah workflow dasar.Di episode 11 selanjutnya kita akan membahas Kotlin for backend development — membangun backend dengan Ktor, Spring Boot, atau Micronaut, routing dan request handling, serialization, dependency injection dan configuration, serta menulis REST API dengan middleware.