Compose, türleri kararlı veya kararsız olarak değerlendirir. Bir tür, değişmezse veya Compose'un yeniden oluşturmalar arasında değerinin değişip değişmediğini bilmesi mümkünse kararlıdır. Compose, bir türün değerinin yeniden oluşturmalar arasında değişip değişmediğini bilemiyorsa bu tür kararsızdır.
Compose, girişleri nasıl karşılaştıracağını belirlemek ve yeniden oluşturma sırasında composable'ı atlayıp atlayamayacağına karar vermek için composable'ın parametrelerinin kararlılığını kullanır (Kotlin 2.0.20'den itibaren varsayılan olarak güçlü atlama modu etkinleştirilir):
- Sabit parametreler: Compose, sabit parametreleri yapısal eşitlik (
Object.equals()) kullanarak karşılaştırır. Bir composable'ın sabit parametreleri önceki değerleriyle eşitse Compose bu composable'ı atlar. - Kararsız parametreler: Güçlü atlama modu etkinleştirildiğinde (Kotlin 2.0.20 ve sonraki sürümlerde varsayılan olarak etkindir) Compose, kararsız parametreleri örnek eşitliği (
===) kullanarak karşılaştırır ve aynı nesne örnekleri iletilirse composable'ı atlar. Kotlin 2.0.20'den önceki sürümlerde (veya Strong skipping modu devre dışı bırakıldığında) üst öğe yeniden oluşturulduğunda Compose, her zaman kararsız parametrelerle bir composable'ı yeniden oluşturur.
Uygulamanız kararsız parametrelerin yeni örneklerini sık sık ayırıyorsa veya modelleri aşırı açıklama ekleyerek büyük koleksiyonlarda pahalı .equals() kontrolleri zorunlu kılıyorsa gereksiz yeniden oluşturmalar veya karşılaştırma ek yükü gözlemleyebilirsiniz.
Bu belgede, Compose'un kararlılığı nasıl belirlediği ve performansı ile genel kullanıcı deneyimini iyileştirmek için kararlılığı nasıl optimize edebileceğiniz ayrıntılı olarak açıklanmaktadır.
Değiştirilemez nesneler
Aşağıdaki snippet'lerde kararlılık ve yeniden oluşturma ile ilgili genel ilkeler gösterilmektedir.
Contact sınıfı, değişmez bir veri sınıfıdır. Bunun nedeni, tüm parametrelerinin val anahtar kelimesiyle tanımlanan temel öğeler olmasıdır. Contact örneği oluşturduktan sonra nesnenin özelliklerinin değerini değiştiremezsiniz.
Bunu yapmaya çalışırsanız yeni bir nesne oluşturursunuz.
data class Contact(val name: String, val number: String)
ContactRow composable'ı, Contact türünde bir parametreye sahip.
@Composable
fun ContactRow(contact: Contact, modifier: Modifier = Modifier) {
var selected by remember { mutableStateOf(false) }
Row(modifier) {
ContactDetails(contact)
ToggleButton(selected, onToggled = { selected = !selected })
}
}
Kullanıcı açma/kapatma düğmesini tıkladığında ve selected durumu değiştiğinde ne olacağını göz önünde bulundurun:
- Compose,
ContactRowiçindeki kodu yeniden oluşturup oluşturmaması gerektiğini değerlendirir. ContactDetailsiçin tek bağımsız değişkeninContacttüründe olduğunu görür.Contactdeğişmez bir veri sınıfı olduğundan Compose,ContactDetailsbağımsız değişkenlerinin hiçbirinin değişmediğinden emin olur.- Bu nedenle, Compose
ContactDetailskarakterini atlar ve yeniden oluşturmaz. - Diğer yandan,
ToggleButtoniçin bağımsız değişkenler değişti ve Compose bu bileşeni yeniden oluşturuyor.
Değiştirilebilir nesneler
Önceki örnekte değişmez bir nesne kullanılsa da değişebilir bir nesne oluşturmak mümkündür. Aşağıdaki snippet'i inceleyin:
data class Contact(var name: String, var number: String)
Contact sınıfının her parametresi artık var olduğundan sınıf sabit değildir.
Özellikleri değişse bile Compose bunu fark etmez. Bunun nedeni, Compose'un yalnızca Compose durum nesnelerindeki değişiklikleri izlemesidir.
Compose, bu tür sınıfları kararsız olarak değerlendirir. Güçlü atlama modu (Kotlin 2.0.20+) ile Compose, Contact öğesini örnek eşitliği (===) kullanarak karşılaştırır:
contact.name öğesini yerinde değiştirme, yeniden oluşturmayı tetiklemez. Aynı değerlere sahip yeni ayrılmış bir Contact örneğini iletme ise ContactDetails öğesini yeniden oluşturmaya zorlar (Güçlü atlama modu olmadan selected her değiştiğinde ContactDetails yeniden oluşturulur).
Compose'da uygulama
Compose'un yeniden oluşturma sırasında hangi işlevlerin atlanacağını nasıl belirlediğini anlamak faydalı olabilir ancak bu bilgi zorunlu değildir.
Compose derleyicisi kodunuzda çalışırken her işlevi ve türü çeşitli etiketlerden biriyle işaretler. Bu etiketler, yeniden oluşturma sırasında Compose'un işlevi veya türü nasıl işlediğini yansıtır.
İşlevler
Compose, işlevleri skippable veya restartable olarak işaretleyebilir. Bir işlevin bu özelliklerden birine, her ikisine veya hiçbirine sahip olmadığını belirtebileceğini unutmayın:
- Atlanabilir: Derleyici, bir composable'ı atlanabilir olarak işaretlerse Compose, tüm bağımsız değişkenleri önceki değerleriyle eşitse yeniden oluşturma sırasında bu composable'ı atlayabilir. (Kotlin 2.0.20 ve sonraki sürümlerde Güçlü atlama modu ile tüm yeniden başlatılabilir composable'lar otomatik olarak atlanabilir.)
- Yeniden başlatılabilir: Yeniden başlatılabilir bir composable, yeniden oluşturmanın başlayabileceği bir "kapsam" görevi görür. Diğer bir deyişle, işlev, durum değişikliklerinden sonra Compose'un yeniden oluşturma için kodu yeniden yürütmeye başlayabileceği bir giriş noktası olabilir.
Türler
Compose, işaret türlerini değişmez veya kararlı olarak sınıflandırır. Her türden yalnızca biri kullanılabilir:
- Değiştirilemez: Compose, özelliklerinin değeri hiçbir zaman değişemezse ve tüm yöntemler referans açısından şeffafsa bir türü değiştirilemez olarak işaretler.
- Tüm temel türlerin değişmez olarak işaretlendiğini unutmayın. Bunlar arasında
String,IntveFloatyer alır.
- Tüm temel türlerin değişmez olarak işaretlendiğini unutmayın. Bunlar arasında
- Sabit: Özellikleri oluşturulduktan sonra değişebilen bir türü belirtir. Bu özellikler çalışma zamanında değiştiğinde Compose bu değişikliklerden haberdar olur.
Kararlılıkla ilgili hata ayıklama
Uygulamanız, parametreleri değişmemiş bir composable'ı yeniden oluşturuyorsa öncelikle her yeniden oluşturma işleminde kararsız türlerin yeni örneklerinin ayrılıp ayrılmadığını (veya Strong skipping modu devre dışıysa composable'ın kararsız türde var özelliklere ya da val özelliklere sahip parametreleri olup olmadığını) kontrol edin.
Oluşturma'daki kararlılıkla ilgili karmaşık sorunları teşhis etme hakkında ayrıntılı bilgi için Kararlılıkla ilgili hata ayıklama kılavuzuna bakın.
Kararlılık sorunlarını düzeltme
Compose uygulamanızda kararlılığı sağlama hakkında bilgi için Kararlılık sorunlarını düzeltme kılavuzuna bakın.
Özet
Genel olarak aşağıdaki noktalara dikkat etmeniz gerekir:
- Parametreler: Compose, yeniden oluşturma sırasında yapısal eşitlik (
.equals()) veya örnek eşitliği (===) kullanarak karşılaştırıp karşılaştırmayacağına karar vermek için composable'larınızın her bir parametresinin kararlılığını belirler. - Anında düzeltmeler: Composable'ınızın atlanmadığını ve performans sorununa neden olduğunu fark ederseniz her geçişte kararsız parametrelerin yeni örneklerinin yeniden oluşturulup oluşturulmadığını veya
Stateyerinevarözelliklerinin kullanılıp kullanılmadığını kontrol edin. - Derleyici raporları: Sınıflarınızla ilgili hangi kararlılığın çıkarıldığını belirlemek için derleyici raporlarını kullanabilirsiniz.
- Koleksiyonlar: Compose, temel uygulamaları değiştirilebilir olabileceğinden standart koleksiyon arayüzlerini (
List,SetveMap) kararsız olarak kabul eder. Güçlü atlama modu (Kotlin 2.0.20 ve sonraki sürümlerde varsayılan olarak etkindir) etkinken, koleksiyon referansı değişmediğinde kararsız koleksiyonlar hızlıO(1)örnek eşitliği (===) kullanılarak yeniden oluşturma atlanır. Her yeniden oluşturmada her öğeyi karşılaştırmak yeniden oluşturmanın kendisinden daha maliyetli olabileceğinden, yapısal eşitlik (O(N).equals()) özellikle gerekli olmadığı sürece büyük koleksiyonları Kotlinx değiştirilemez koleksiyonlara dönüştürmekten veya koleksiyon tutan sınıfları@Immutableya da@Stableile notlandırmaktan kaçının. - Diğer modüller: Compose, Compose derleyicisinin çalışmadığı modüllerdeki sınıfları kararsız olarak kabul eder (Strong skipping modunda
===kullanılarak karşılaştırılır). Bir veri kaynağı, Compose dışı modüllerden küçük ve düz modelleri aynı değerlerle sık sık yeniden oluşturuyorsa kararlılık yapılandırma dosyası oluşturabilir veya@Stableya da@Immutablekullanabilirsiniz. Burada.equals()ucuzdur.
Daha fazla bilgi
- Performans: Compose performansıyla ilgili daha fazla hata ayıklama ipucu için en iyi uygulamalar kılavuzumuzu ve I/O konuşmamızı inceleyin.