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
ContactDetails
adalah jenisContact
. - Karena
Contact
adalah class data yang tidak dapat diubah, Compose memastikan bahwa tidak satu pun argumen untukContactDetails
telah berubah. - Dengan demikian, Compose melewati
ContactDetails
dan tidak merekomposisi. - 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
, 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
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
danMap
. 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
- Performa: Untuk tips proses debug lainnya tentang performa Compose, lihat panduan praktik terbaik dan diskusi I/O kami.