Stabilitas dalam Compose

Compose menganggap jenis sebagai stabil atau tidak stabil. Jenis akan stabil jika tidak dapat diubah, atau jika Compose dapat mengetahui apakah nilainya telah berubah di antara rekomposisi. Jenis tidak stabil jika Compose tidak dapat mengetahui apakah nilainya telah berubah di antara rekomposisi.

Compose menggunakan stabilitas parameter composable untuk menentukan apakah Compose dapat melewati composable selama rekomposisi:

  • Parameter stabil: Jika composable memiliki parameter stabil yang tidak berubah, Compose akan melewatinya.
  • Parameter yang tidak stabil: Jika composable memiliki parameter yang tidak stabil, Compose akan selalu merekomposisi saat mengomposisi ulang induk komponen.

Jika aplikasi Anda menyertakan banyak komponen tidak stabil yang selalu direkomposisi oleh Compose, Anda mungkin melihat masalah performa dan masalah lainnya.

Dokumen ini menjelaskan cara meningkatkan stabilitas aplikasi untuk meningkatkan performa dan pengalaman pengguna secara keseluruhan.

Objek yang tidak dapat diubah

Cuplikan berikut menunjukkan prinsip umum di balik stabilitas dan rekomposisi.

Class Contact adalah class data yang tidak dapat diubah. Hal ini karena semua parameternya adalah primitif yang ditentukan dengan kata kunci val. Setelah membuat instance Contact, Anda tidak dapat mengubah nilai properti objek. Jika Anda mencoba melakukannya, Anda akan membuat objek baru.

data class Contact(val name: String, val number: String)

Composable ContactRow memiliki parameter jenis Contact.

@Composable
fun ContactRow(contact: Contact, modifier: Modifier = Modifier) {
   var selected by remember { mutableStateOf(false) }

   Row(modifier) {
      ContactDetails(contact)
      ToggleButton(selected, onToggled = { selected = !selected })
   }
}

Pertimbangkan apa yang terjadi saat pengguna mengklik tombol dan status selected berubah:

  1. Compose mengevaluasi apakah harus merekomposisi kode di dalam ContactRow.
  2. Melihat bahwa satu-satunya argumen untuk ContactDetails adalah jenis Contact.
  3. Karena Contact adalah class data yang tidak dapat diubah, Compose yakin bahwa tidak ada argumen untuk ContactDetails yang berubah.
  4. Dengan demikian, Compose akan melewati ContactDetails dan tidak mengomposisi ulangnya.
  5. Di sisi lain, argumen untuk ToggleButton telah berubah, dan Compose merekomposisi komponen tersebut.

Objek yang dapat berubah

Meskipun contoh sebelumnya menggunakan objek yang tidak dapat diubah, Anda dapat membuat objek yang dapat diubah. Pertimbangkan cuplikan berikut:

data class Contact(var name: String, var number: String)

Karena setiap parameter Contact sekarang menjadi var, class ini tidak lagi tidak dapat diubah. Jika propertinya berubah, Compose tidak akan mengetahuinya. Ini karena Compose hanya melacak perubahan pada objek Status Compose.

Compose menganggap class tersebut tidak stabil. Compose tidak melewati rekomposisi class yang tidak stabil. Dengan demikian, jika Contact ditentukan dengan cara ini, ContactRow pada contoh sebelumnya akan merekomposisi setiap kali selected berubah.

Implementasi di Compose

Meskipun tidak penting, pertimbangkan cara Compose menentukan fungsi mana yang akan dilewati selama rekomposisi.

Saat berjalan pada kode Anda, compiler Compose akan menandai setiap fungsi dan mengetik dengan salah satu dari beberapa tag. Tag ini mencerminkan cara Compose menangani fungsi atau jenis selama rekomposisi.

Fungsi

Compose dapat menandai fungsi sebagai skippable atau restartable. Perlu diperhatikan bahwa perintah ini dapat menandai fungsi sebagai salah satu, keduanya, atau tidak satu pun dari pernyataan ini:

  • Dapat dilewati: Jika compiler menandai composable sebagai dapat dilewati, Compose dapat melewatkannya selama rekomposisi jika semua argumennya sama dengan nilai sebelumnya.
  • Dapat dimulai ulang: Composable yang dapat dimulai ulang berfungsi sebagai "cakupan" tempat rekomposisi dapat dimulai. Dengan kata lain, fungsi tersebut dapat menjadi titik entri tempat Compose dapat mulai mengeksekusi ulang kode untuk rekomposisi setelah perubahan status.

Jenis

Compose menandai jenis sebagai tidak dapat diubah atau stabil. Setiap jenis merupakan salah satu jenis tersebut:

  • Tidak dapat diubah: Compose menandai jenis sebagai tidak dapat diubah jika nilai propertinya tidak pernah dapat berubah dan semua metode transparan secara referensial.
    • Perlu diperhatikan bahwa semua jenis primitif ditandai sebagai tidak dapat diubah. Alat tersebut mencakup String, Int, dan Float.
  • Stabil: Menunjukkan jenis yang propertinya dapat berubah setelah dibuat. Jika dan saat properti tersebut berubah selama runtime, Compose akan mengetahui perubahan tersebut.

Stabilitas debug

Jika aplikasi Anda merekomposisi composable yang parameternya tidak berubah, periksa terlebih dahulu definisinya untuk parameter yang jelas dapat berubah. Compose selalu merekomposisi komponen jika Anda meneruskan jenis dengan properti var, atau properti val yang menggunakan jenis yang tidak stabil yang diketahui.

Untuk informasi selengkapnya tentang cara mendiagnosis masalah kompleks terkait stabilitas di Compose, lihat panduan Stabilitas debug.

Memperbaiki masalah stabilitas

Untuk mengetahui informasi cara meningkatkan stabilitas implementasi Compose, lihat panduan Memperbaiki masalah stabilitas.

Ringkasan

Secara keseluruhan, Anda harus memperhatikan poin-poin berikut:

  • Parameter: Compose menentukan stabilitas setiap parameter composable untuk menentukan composable mana yang harus dilewati selama rekomposisi.
  • Perbaikan langsung: Jika Anda melihat composable tidak dilewati dan menyebabkan masalah performa, Anda harus memeriksa penyebab ketidakstabilan yang jelas seperti parameter var terlebih dahulu.
  • Laporan compiler: Anda dapat menggunakan laporan compiler untuk menentukan stabilitas yang sedang disimpulkan tentang class Anda.
  • Koleksi: Compose selalu menganggap class koleksi tidak stabil, seperti List, Set dan Map. Ini karena tidak dapat dijamin bahwa keduanya tidak dapat diubah. Anda dapat menggunakan koleksi Kotlinx yang tidak dapat diubah sebagai gantinya atau menganotasi class sebagai @Immutable atau @Stable.
  • Modul lain: Compose selalu mempertimbangkan kestabilan di mana modul tersebut berasal dari modul tempat compiler Compose tidak berjalan. Menggabungkan class dalam class model UI jika diperlukan.

Bacaan lebih lanjut