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:
- Compose mengevaluasi apakah harus merekomposisi kode di dalam
ContactRow
. - Melihat bahwa satu-satunya argumen untuk
ContactDetails
adalah jenisContact
. - Karena
Contact
adalah class data yang tidak dapat diubah, Compose yakin bahwa tidak ada argumen untukContactDetails
yang berubah. - Dengan demikian, Compose akan melewati
ContactDetails
dan tidak mengomposisi ulangnya. - 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
, danFloat
.
- Perlu diperhatikan bahwa semua jenis primitif ditandai sebagai tidak dapat diubah. Alat tersebut mencakup
- 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
danMap
. 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
- Performa: Untuk tips proses debug lainnya terkait performa Compose, lihat panduan praktik terbaik dan I/O talk kami.