Performansa neden olan kararsız bir sınıfla karşılaştığınızda sorun varsa kararlı hale getirmelisiniz. Bu belgede, ekibinizin genel olarak e-tablo kullanabilirsiniz.
Güçlü atlamayı etkinleştir
Önce güçlü atlama modunu etkinleştirmeyi denemelisiniz. Güçlü atlama modu kararsız parametrelere sahip composable'ların atlanmasına olanak tanır ve bu, en kolay yöntemini de kullanabilirsiniz.
Daha fazla bilgi için Güçlü atlama bölümüne bakın.
Sınıfı sabit hale getirin
Ayrıca istikrarsız bir sınıfı tamamen değiştirilemez hale getirmeyi de deneyebilirsiniz.
- Sabit: Herhangi bir özelliğin değerinin hiçbir zaman değiştirilmeyeceği türü belirtir.
oluşturulduktan sonra gerçekleşen değişimden ve tüm yöntemlerde
şeffaf hale getiriyoruz.
- Sınıfın tüm özelliklerinin
var
yerineval
olduğundan emin olun. ve sabit türleri bulunur. String, Int
veFloat
gibi temel türler her zaman değiştirilemez.- Bu mümkün değilse özellikleri olabilir.
- Sınıfın tüm özelliklerinin
- Kararlı: Değişebilir bir türü belirtir. Compose çalışma zamanı türün herkese açık mülklerinden veya yöntemlerinden herhangi birinin önceki çağrıdan farklı sonuçlar verebilir.
Sabit koleksiyonlar
Compose'un bir sınıfı kararsız olarak kabul etmesinin yaygın nedenlerinden biri koleksiyonlardır. Belirtildiği gibi
Kararlılık sorunlarını teşhis edin sayfasında, Oluştur derleyicisi
List, Map
ve Set
gibi koleksiyonların
ve dolayısıyla kararsız olarak kabul edilir.
Bu sorunu çözmek için sabit koleksiyonları kullanabilirsiniz. Compose derleyici Kotlinx Sabit Koleksiyonları desteği içerir. Bu koleksiyonların değişmez olması garanti edilir ve Compose derleyicisi bu koleksiyonları bu şekildedir. Bu kitaplık hâlâ alfa sürümünde olduğundan API'sinde olası değişiklikler olabilir.
Kararlılığı teşhis etme sürecindeki bu kararsız sınıfı tekrar düşünün sorunları kılavuzu:
unstable class Snack {
…
unstable val tags: Set<String>
…
}
Sabit bir koleksiyon kullanarak tags
ürününü kararlı hale getirebilirsiniz. Sınıfta
tags
- ImmutableSet<String>
türü:
data class Snack{
…
val tags: ImmutableSet<String> = persistentSetOf()
…
}
Bunu yaptıktan sonra, sınıfın tüm parametreleri sabit kalır ve Oluştur derleyici, sınıfı kararlı olarak işaretler.
Stable
veya Immutable
ile not ekleyin
Kararlılık sorunlarını çözmenin olası bir yolu, kararsız sınıflara açıklama eklemektir
@Stable
veya @Immutable
ile değiştirin.
Bir sınıfa ek açıklama eklenmesi, derleyicinin normalde yazacağı işlemi geçersiz kılar
çıkarımda bulunun. Bu,
!!
Kotlin'deki operatör. Bu kursta öğreneceğiniz
nasıl kullandığınız konusunda dikkatli olun. Derleyici davranışını geçersiz kılma
öngörülemeyen hatalara neden olabilir. Örneğin, composable’ın
görebilirsiniz.
Sınıfınızı ek açıklama olmadan kararlı hale getirmek mümkünse istikrarı bu şekilde sağlamak için çaba sarf etmeniz gerekir.
Aşağıdaki snippet, sabit:
@Immutable
data class Snack(
…
)
İster @Immutable
ister @Stable
ek açıklamasını kullanın, Compose derleyici
Snack
sınıfını kararlı olarak işaretler.
Koleksiyonlardaki ek açıklamalı sınıflar
List<Snack>
türünde parametre içeren bir composable'ı düşünün:
restartable scheme("[androidx.compose.ui.UiComposable]") fun HighlightedSnacks(
…
unstable snacks: List<Snack>
…
)
Snack
@Immutable
için ek açıklama ekleseniz bile Compose derleyici
HighlightedSnacks
öğesindeki snacks
parametresi kararsız olarak değiştirildi.
Parametreler, koleksiyon türleri söz konusu olduğunda sınıflarla aynı sorunla karşılaşır.
Compose derleyici, List
türündeki bir parametreyi her zaman kararsız olarak işaretler.
sabit türlerin bir koleksiyonu olduğunda.
Tek bir parametreyi sabit olarak işaretleyemez veya bir parametreye ek açıklama ekleyemezsiniz. her zaman atlanabilir olması gerekir. İleriye doğru birden fazla yol var.
Kararsız koleksiyon sorununu çözmenin çeşitli yolları vardır. Aşağıdaki alt bölümlerde bu farklı yaklaşımlar açıklanmaktadır.
Yapılandırma dosyası
Kod tabanınızdaki kararlılık sözleşmesine uymaktan memnunsanız
Kotlin koleksiyonlarını kararlı olarak kabul etmek için
kotlin.collections.*
-
kararlılık yapılandırma dosyasına bakın.
Sabit koleksiyon
Değişkenliğin derleme zamanı güvenliği için şunları yapabilirsiniz:
List
yerine kotlinx sabit koleksiyonu kullanın.
@Composable
private fun HighlightedSnacks(
…
snacks: ImmutableList<Snack>,
…
)
Wrapper
Sabit bir koleksiyon kullanamıyorsanız kendi koleksiyonunuzu oluşturabilirsiniz. Bunun için,
List
öğesini ek açıklamalı bir kararlı sınıfta sarmalama. Genel bir sarmalayıcı muhtemelen
gereksinimlerinize bağlı olarak
en iyi tercih olabilir.
@Immutable
data class SnackCollection(
val snacks: List<Snack>
)
Daha sonra bunu composable'ınızdaki parametre türü olarak kullanabilirsiniz.
@Composable
private fun HighlightedSnacks(
index: Int,
snacks: SnackCollection,
onSnackClick: (Long) -> Unit,
modifier: Modifier = Modifier
)
Çözüm
Bu yaklaşımlardan herhangi birini uyguladıktan sonra, Compose derleyicisi artık
HighlightedSnacks
Hem skippable
hem de restartable
olarak oluşturulabilir.
restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun HighlightedSnacks(
stable index: Int
stable snacks: ImmutableList<Snack>
stable onSnackClick: Function1<Long, Unit>
stable modifier: Modifier? = @static Companion
)
Compose, yeniden oluşturma sırasında HighlightedSnacks
öğesini atlayabilir.
giriş değişti.
Kararlılık yapılandırma dosyası
Compose Compiler 1.5.5 ile başlayarak,
derleme sırasında sağlanabilir. Bu sayede ekip arkadaşlarınızın
standart kütüphane sınıfları gibi sizin kontrol etmediğiniz sınıflar
(LocalDateTime
) kararlı olarak.
Yapılandırma dosyası, her satırda bir sınıf bulunan bir düz metin dosyasıdır. Yorumlar tek ve çift joker karakterler desteklenir. Aşağıda bir yapılandırma örneği gösterilmiştir:
// Consider LocalDateTime stable
java.time.LocalDateTime
// Consider kotlin collections stable
kotlin.collections.*
// Consider my datalayer and all submodules stable
com.datalayer.**
// Consider my generic type stable based off it's first type parameter only
com.example.GenericClass<*,_>
Bu özelliği etkinleştirmek için yapılandırma dosyasının yolunu Oluştur derleyici seçenekleri hakkında bilgi edinin.
Eski
kotlinOptions {
freeCompilerArgs += [
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:stabilityConfigurationPath=" +
project.absolutePath + "/compose_compiler_config.conf"
]
}
Kotlin
kotlinOptions {
freeCompilerArgs += listOf(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:stabilityConfigurationPath=" +
"${project.absolutePath}/compose_compiler_config.conf"
)
}
Compose derleyicisi, projenizdeki her modülde ayrı ayrı çalıştığından Gerekirse farklı modüllere farklı yapılandırmalar sağlayabilirsiniz. Alternatif olarak kök düzeyinde yapılandırmanız gerekir ve bu yolu modülünü kullanabilirsiniz.
Birden fazla modül
Sık karşılaşılan diğer bir sorun ise çok modüllü mimariyle ilgilidir. Compose derleyici bir sınıfın kararlı olup olmadığını, ancak ilgili sınıfa ait temel olmayan tüm türlerin veya daha eski bir modüle eklenen bir modülde Compose derleyici ile de geliştirilmiştir.
Veri katmanınız kullanıcı arayüzü katmanınızdan ayrı bir modülde ise veya önerilen yaklaşımlardan biri budur. Bu da karşılaştığınız bir sorun olabilir.
Çözüm
Bu sorunu çözmek için aşağıdaki yaklaşımlardan birini uygulayabilirsiniz:
- Sınıfları Derleyici yapılandırma dosyanıza ekleyin.
- Veri katmanı modüllerinizde Compose derleyicisini etkinleştirin veya sınıflarınızı etiketleyin
Uygun durumlarda
@Stable
veya@Immutable
ile.- Bu işlem, veri katmanınıza bir Compose bağımlılığı eklemeyi içerir. Ancak,
bu yalnızca Compose çalışma zamanı için bağımlılık
Compose-UI
- Bu işlem, veri katmanınıza bir Compose bağımlılığı eklemeyi içerir. Ancak,
bu yalnızca Compose çalışma zamanı için bağımlılık
- Kullanıcı arayüzü modülünüzde veri katmanı sınıflarınızı kullanıcı arayüzüne özel sarmalayıcı ile sarmalayın sınıflar.
Aynı sorun, Derleyici oluşturun.
Her composable atlanabilir olmamalıdır
Kararlılıkla ilgili sorunları çözmeye çalışırken her sorunu çözmek için composable atlanabilir. Bunu yapmaya çalışmak, erken optimizasyona neden olabilir daha fazla soruna yol açabilir.
Atlanabilir olmanın gerçek bir avantaj sağlamadığı birçok durum vardır ve kullanılması zor koda yol açabilir. Örnek:
- Sık sık veya hiç yeniden bestelenmeyen bir composable.
- Tek başına yalnızca atlanabilir composable'lara çağrı yapan bir composable.
- Pahalı eşitliklere sahip ve çok sayıda parametreye sahip bir composable hakkında bilgi edindiniz. Bu durumda, herhangi bir parametrenin maliyet, ucuz bir yeniden düzenleme maliyetinden daha ağır basabilir.
Bir composable atlanabilir olduğunda, değmemeye değer küçük bir ek yük getirir somut olarak ortaya koyar. Bazı durumlarda composable'ınıza yeniden başlatılamaz şeklinde ek açıklama bile ekleyebilirsiniz. bir karara varmalısınız.