Stabilitas dalam Compose

Compose menganggap jenis stabil atau tidak stabil. Suatu jenis dianggap stabil jika tidak dapat diubah, atau jika Compose dapat mengetahui apakah nilainya 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 composable tersebut dapat melewati composable selama rekomposisi:

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

Jika aplikasi Anda menyertakan banyak komponen tidak stabil yang tidak perlu, yang selalu Compose merekomposisi, Anda mungkin mengamati masalah kinerja dan masalah lainnya.

Dokumen ini menjelaskan cara meningkatkan stabilitas aplikasi Anda untuk meningkatkan kinerja 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. Ini karena semua parameter adalah primitif yang ditentukan dengan kata kunci val. Setelah Anda 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 ketika pengguna mengeklik tombol beralih dan Perubahan status selected:

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

Objek yang dapat berubah

Meskipun contoh sebelumnya menggunakan objek yang tidak dapat diubah, kita dapat membuat yang dapat berubah. Perhatikan 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 menyadarinya. Hal ini karena Compose hanya melacak perubahan pada objek Status Compose.

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

Implementasi di Compose

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

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

Fungsi

Compose dapat menandai fungsi sebagai skippable atau restartable. Perhatikan bahwa mungkin menandai fungsi sebagai salah satu, keduanya, atau tidak satu pun dari berikut 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" dengan proses rekomposisi dapat dimulai. Dengan kata lain, fungsi ini bisa menjadi sebuah 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 adalah satu atau lainnya:

  • Tidak dapat diubah: Compose menandai jenis sebagai tidak dapat diubah jika nilai properti tidak pernah dapat berubah dan semua metode bersifat referensial transparan.
    • Perhatikan bahwa semua jenis primitif ditandai sebagai tidak dapat diubah. Termasuk di antaranya String, Int, dan Float.
  • Stabil: Menunjukkan jenis yang propertinya dapat berubah setelah konstruksi. Jika dan saat properti tersebut berubah selama runtime, Compose akan mengetahui perubahan tersebut.

Stabilitas debug

Jika aplikasi Anda merekomposisi composable yang parameternya belum berubah, pertama-tama periksa definisinya untuk parameter yang jelas dapat diubah. Tulis selalu merekomposisi komponen jika Anda meneruskan jenis dengan properti var, atau val properti yang menggunakan jenis tidak stabil yang diketahui.

Untuk informasi terperinci tentang cara mendiagnosis masalah yang kompleks dengan stabilitas Compose, lihat panduan Stabilitas debug.

Memperbaiki masalah stabilitas

Untuk informasi tentang cara meningkatkan stabilitas pada 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 itu menyebabkan masalah performa, Anda harus memeriksa penyebab yang jelas dari ketidakstabilan seperti parameter var terlebih dahulu.
  • Laporan compiler: Anda dapat menggunakan laporan compiler untuk menentukan stabilitas yang disimpulkan tentang class Anda.
  • Koleksi: Compose selalu menganggap class koleksi tidak stabil, seperti sebagai List, Set dan Map. Ini karena tidak ada jaminan bahwa mereka tidak dapat diubah. Anda dapat menggunakan koleksi Kotlinx yang tidak dapat diubah sebagai gantinya atau anotasikan class Anda sebagai @Immutable atau @Stable.
  • Modul lainnya: Compose selalu menganggap tidak stabil dari mana asalnya modul tempat compiler Compose tidak berjalan. Menggabungkan class di UI kelas model jika diperlukan.

Bacaan lebih lanjut