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:
- Compose mengevaluasi apakah harus merekomposisi kode di dalam
ContactRow. - Ia melihat bahwa satu-satunya argumen untuk
ContactDetailsadalah jenisContact. - Karena
Contactadalah class data yang tidak dapat diubah, Compose memastikan bahwa tidak satu pun argumen untukContactDetailstelah berubah. - Dengan demikian, Compose melewati
ContactDetailsdan tidak merekomposisi. - Di sisi lain, argumen untuk
ToggleButtontelah 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, danFloat.
- Perhatikan bahwa semua jenis primitif ditandai sebagai tidak dapat diubah. Termasuk di antaranya
- 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
varterlebih 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, SetdanMap. 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@Immutableatau@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
- Performa: Untuk tips proses debug lainnya tentang performa Compose, lihat panduan praktik terbaik dan diskusi I/O kami.