Kararlılık sorunlarını düzeltin

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 yerine val olduğundan emin olun. ve sabit türleri bulunur.
    • String, Int ve Float gibi temel türler her zaman değiştirilemez.
    • Bu mümkün değilse özellikleri olabilir.
  • 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.
ziyaret edin.

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:

  1. Sınıfları Derleyici yapılandırma dosyanıza ekleyin.
  2. 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
  3. 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.