Composition: esensi, pembangunan pohon UI di Compose

Penulis: IT Sectr Diterbitkan: 2026-06-27 Waktu membaca: 7 mnt

Composition — adalah proses sentral di Jetpack Compose, di mana dari fungsi Composable deskriptif dibangun pohon UI hidup yang ditampilkan di layar. Berbeda dengan sistem View di Android, di mana tata letak dimuat dari XML dan diubah menjadi objek yang tidak dapat diubah, Composition bekerja sebagai sistem dinamis: fungsi dijalankan, membuat slot di memori, membentuk hierarki node dan menghubungkannya dengan status. Menurut Google Android Developers, 2026, memahami Composition sangat penting untuk mengoptimalkan kinerja aplikasi Compose.

Poin utama

  • Composition — eksekusi fungsi Composable untuk membangun pohon UI
  • Slot — sel memori yang menyimpan parameter dan status setiap fungsi
  • Posisi di Compose (Positional Memorization) mengikat status ke tempat dalam kode
  • Lintasan pertama Composition membuat pohon UI awal saat layar dijalankan
  • CompositionLocal mengirimkan data melalui pohon tanpa parameter eksplisit

Apa itu Composition di Jetpack Compose

Composition — adalah proses eksekusi fungsi Composable, yang menghasilkan representasi internal antarmuka pengguna dalam bentuk pohon node. Setiap node dari pohon ini sesuai dengan komponen bawaan (Text, Button, Image) atau panggilan fungsi Composable kustom. Composition tidak langsung membuat objek View Android — ia membangun deskripsi abstrak yang kemudian diproses oleh fase Layout dan Drawing.

Ciri utama Composition adalah kemampuan restart ulang (restartability). Setiap fungsi Composable dalam komposisi dapat dijalankan ulang kapan saja jika parameter masukannya atau objek status yang dibacanya berubah. Sistem tidak merestart seluruh pohon — hanya fungsi yang benar-benar bergantung pada data yang berubah.

Secara teknis, Composition dikelola melalui Composer — mesin internal yang disematkan kompiler Kotlin ke dalam setiap fungsi Composable. Composer menulis ke dalam slot (grup posisi) informasi tentang fungsi mana yang dipanggil, dengan parameter apa, dan dalam urutan apa. Pada panggilan berikutnya, Composer membandingkan data baru dengan data yang disimpan dan memutuskan untuk merestart.

Bagaimana pohon UI dibangun dalam proses Composition

Proses pembangunan pohon UI dimulai dengan pemanggilan metode setContent di dalam Activity atau Fragment. Metode ini membuat Composition awal dan memulai eksekusi fungsi Composable akar. Kemudian setiap fungsi Composable bersarang menambahkan node-nya ke pohon, membentuk hierarki: Row berisi Text dan Button, Column berisi Image dan Card, dan seterusnya.

Setiap node pohon mendapatkan kunci posisi unik, berdasarkan posisinya dalam kode sumber. Kunci ini digunakan untuk mengidentifikasi node pada eksekusi berulang. Kunci posisi adalah alasan mengapa urutan pemanggilan fungsi Composable tidak boleh bergantung pada kondisi: jika dalam satu eksekusi dipanggil A -> B, dan pada eksekusi berikutnya B -> A, Compose tidak akan dapat mencocokkan node lama dan baru.

kotlin
@Composable
fun AppScreen() {
    Column {                     // Node Column (posisi 1)
        HeaderSection()            // Node HeaderSection (posisi 2)
        ContentSection()           // Node ContentSection (posisi 3)
        FooterSection()            // Node FooterSection (posisi 4)
    }
}

@Composable
fun HeaderSection() {
    Row {                       // Node Row (posisi 2.1)
        Text("Judul")         // Node Text (posisi 2.2)
        Icon(...)                // Node Icon (posisi 2.3)
    }
}

Dalam contoh ini, setiap panggilan mendapatkan posisi berdasarkan urutan dalam kode. Column (posisi 1) berisi tiga node anak (posisi 2, 3, 4). HeaderSection menambahkan dua node anak lagi (2.1, 2.2, 2.3). Jika dalam rek komposisi berikutnya ContentSection dipanggil sebelum HeaderSection, Composer tidak akan dapat mencocokkan node dengan benar — maka aturannya: urutan pemanggilan fungsi Composable harus stabil.

Manajemen status di Composition

Status di Composition dikelola melalui objek bertipe State<T>. Ketika fungsi Composable membaca nilai dari State melalui properti delegasi (by), ia mendaftarkan ketergantungan pada State tersebut. Saat nilai berubah, semua fungsi yang membaca State ini ditandai untuk dijalankan ulang pada fase komposisi berikutnya.

Mekanisme pendaftaran ketergantungan disebut sistem snapshot. Setiap kali State berubah, snapshot mencatat semua perubahan dan memberi tahu Composer fungsi mana yang bergantung pada State ini. Penting untuk dipahami: membaca State dalam kode non-Composable (misalnya dalam lambda onClick) tidak mendaftarkan ketergantungan — hanya pembacaan di dalam fungsi Composable atau dalam lambda yang dijalankan dalam konteks komposisi.

Sistem snapshot bekerja secara transaksional: beberapa perubahan State dalam satu peristiwa digabungkan menjadi satu transaksi, mencegah beberapa rek komposisi. Ini sangat penting dalam pemrosesan gestur: selama satu gerakan, beberapa objek State berubah, tetapi Compose hanya menjalankan satu rek komposisi.

kotlin
@Composable
fun StateExample() {
    var text by remember { mutableStateOf("Hello") }
    var isVisible by remember { mutableStateOf(true) }

    Column {
        Text(text)  // mendaftarkan ketergantungan pada text

        if (isVisible) {  // mendaftarkan ketergantungan pada isVisible
            TextField(value = text, onValueChange = { text = it })
        }

        Button(onClick = { isVisible = !isVisible }) {
            Text(if (isVisible) "Sembunyikan" else "Tampilkan")
        }
    }
}

Perubahan text menyebabkan rek komposisi hanya pada Column, Text, dan TextField. Button dan kondisi isVisible tetap tidak berubah. Isolasi rek komposisi semacam ini adalah keunggulan utama Compose dibandingkan sistem yang menggambar ulang seluruh layar. Setiap fungsi Composable hanya melacak objek State yang dibacanya secara langsung.

Composition vs Recomposition: perbedaan utama

Composition (komposisi) dan Recomposition (rek komposisi) — adalah dua mode eksekusi fungsi Composable yang berbeda. Composition terjadi satu kali saat pembuatan layar: sistem menjalankan semua fungsi Composable dengan nilai awal dan membangun pohon UI awal. Recomposition terjadi berkali-kali saat perubahan data: sistem merestart hanya fungsi yang bergantung pada status yang berubah.

Mode Composition mengaktifkan semua node pohon, mengalokasikan slot untuk setiap fungsi, mendaftarkan semua turunan. Recomposition bekerja secara selektif: Composer membandingkan nilai parameter baru dan lama dari setiap fungsi, dan jika tidak berubah — fungsi tidak dijalankan (skipping).

Composition dan Recomposition berbeda dalam biaya. Composition pertama lebih mahal, karena memerlukan pembangunan pohon lengkap dan alokasi slot. Recomposition lebih murah, terutama jika sebagian besar fungsi stabil — parameternya dibandingkan dengan equals, dan Compose melewatkan panggilannya. Untuk kinerja maksimal, harus diupayakan agar sesedikit mungkin fungsi yang terkena rek komposisi.

KarakteristikCompositionRecomposition
Kapan terjadiSatu kali, saat tampilan pertamaBerkali-kali, saat perubahan data
CakupanSeluruh pohonHanya fungsi yang berubah
Perbandingan parameterTidak dilakukanDilakukan untuk skipping
Pembuatan slotYa, semua slot dibuatHanya untuk node baru

CompositionLocal: mengirimkan data melalui pohon

CompositionLocal — mekanisme pengiriman data implisit melalui pohon komposisi. Ini memecahkan masalah ketika parameter harus dikirimkan melalui puluhan fungsi Composable bersarang yang tidak menggunakannya secara langsung. Alih-alih rantai parameter eksplisit, data diatur di tingkat atas dan dibaca di fungsi bersarang mana pun melalui CompositionLocal.current.

Tema MaterialTheme — contoh CompositionLocal yang paling terkenal. Semua komponen Compose membaca warna, tipografi, dan bentuk melalui MaterialTheme.colorScheme, MaterialTheme.typography, MaterialTheme.shapes, tanpa menerimanya melalui parameter. Pengembang dapat membuat CompositionLocal sendiri untuk data seperti pengguna saat ini, pengaturan lokalisasi, atau konfigurasi layar.

Batasan penting: CompositionLocal tidak boleh digunakan untuk data yang sering berubah (posisi gulir, teks di bidang input). Komponen yang membaca CompositionLocal di-restart setiap kali nilai berubah, oleh karena itu untuk data dinamis lebih baik menggunakan parameter eksplisit atau State. CompositionLocal optimal untuk data konfigurasi yang jarang atau tidak pernah berubah.

kotlin
val LocalUser = compositionLocalOf<User?> { null }

@Composable
fun AppRoot(user: User, content: @Composable () -> Unit) {
    CompositionLocalProvider(LocalUser.provides(user)) {
        content()
    }
}

@Composable
fun UserAvatar() {
    val user = LocalUser.current  // membaca tanpa parameter eksplisit
    AsyncImage(model = user?.avatarUrl, contentDescription = "Avatar")
}

CompositionLocalProvider menciptakan lingkup visibilitas, di dalamnya LocalUser.current mengembalikan nilai yang ditetapkan. UserAvatar membaca pengguna tanpa pengiriman parameter eksplisit melalui fungsi perantara. Ini sangat berharga dalam hierarki dalam di mana data hanya diperlukan di beberapa node daun.

Pertanyaan yang sering diajukan

Apa yang terjadi jika State diubah selama Composition?

Perubahan State selama Composition menjadwalkan rek komposisi baru yang akan dijalankan setelah yang saat ini selesai. Tidak terjadi perulangan: Compose menjamin bahwa setiap rek komposisi dijalankan dalam transaksi terpisah dari sistem snapshot.

Berapa lama Composition layar yang kompleks?

Pada perangkat modern, Composition layar dengan 50–100 fungsi Composable memakan waktu 1–5 ms. Google merekomendasikan untuk tetap dalam 16 ms per frame pada 60fps. Jika Composition melebihi batas ini, gunakan LazyColumn atau bagi layar menjadi fungsi yang lebih kecil.

Bisakah Composition dijalankan secara manual?

Menjalankan Composition secara manual langsung tidak mungkin — dikelola secara otomatis oleh Composer. Namun, seseorang dapat memaksa menjadwalkan rek komposisi dengan mengubah State atau memanggil invalidate() pada komposit akar, jika ada akses ke CompositionContext.

Apa perbedaan Composition dari hierarki View di Android klasik?

Hierarki View — adalah pohon objek Java yang tidak dapat diubah yang dibuat satu kali. Composition — pohon virtual yang dibangun ulang pada setiap perubahan data. View menyimpan statusnya dalam variabel instance, Composition — dalam slot yang terikat pada posisi panggilan fungsi.

Bagaimana Composition menangani penghapusan node?

Jika fungsi Composable berhenti dipanggil (misalnya kondisi if menjadi false), Composition menghapus node-nya dan memanggil pembersihan DisposableEffect. Saat muncul kembali (if menjadi true lagi) node baru dibuat — node lama tidak dipulihkan.

Ringkasan

  • Composition — proses eksekusi fungsi Composable untuk membangun pohon UI yang terikat dengan status
  • Composer mengelola slot, mencatat panggilan fungsi dan membandingkan parameter saat rek komposisi
  • Sistem snapshot mendaftarkan ketergantungan fungsi pada State dan menggabungkan perubahan dalam transaksi
  • Composition dijalankan sekali saat startup, Recomposition — saat perubahan data
  • CompositionLocal mengirimkan data konfigurasi melalui pohon tanpa rantai parameter eksplisit
  • Posisi panggilan fungsi berfungsi sebagai pengidentifikasi uniknya di pohon komposisi
  • Rekomendasi: buat fungsi Composable kecil dengan parameter yang tidak dapat diubah untuk skipping yang efektif

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga