Oluşturulmada Kararlılık

Oluşturma, türleri kararlı veya kararsız olarak kabul eder. Bir tür sabitse veya Compose'un değerinin yeniden derlemeler arasında değişip değişmediğini bilmesi mümkünse sabittir. Compose değerinin yeniden derlemeler arasında değişip değişmediğini bilmeyen türler kararsızdır.

Compose, recomposition sırasında composable'ı atlayıp atlayamayacağını belirlemek için bir composable'ın parametrelerinin kararlılığını kullanır:

  • Kararlı parametreler: Bir composable'ın değişmemiş sabit parametreleri varsa Compose bunu atlar.
  • Kararsız parametreler: Bir composable'ın kararsız parametreleri varsa Compose, bileşenin üst öğesini yeniden oluşturduğunda bunu her zaman yeniden oluşturur.

Uygulamanızda, Compose'un her zaman yeniden oluşturduğu gereksiz çok sayıda kararsız bileşen varsa performans sorunları ve başka sorunlarla karşılaşabilirsiniz.

Bu dokümanda, performansı ve genel kullanıcı deneyimini iyileştirmek için uygulamanızın kararlılığını nasıl artırabileceğiniz açıklanmaktadır.

Sabit nesneler

Aşağıdaki snippet'lerde kararlılık ve yeniden kompozisyonun arkasındaki genel ilkeler gösterilmektedir.

Contact sınıfı sabit bir veri sınıfıdır. Bunun nedeni, parametreye ait tüm parametrelerin val anahtar kelimesiyle tanımlanan temel öğeler olmasıdır. Contact örneği oluşturduğunuzda, nesnenin özelliklerinin değerini değiştiremezsiniz. Bunu yapmaya çalıştıysanı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ı düşünün:

  1. Compose, ContactRow içindeki kodu yeniden oluşturup oluşturmayacağını değerlendirir.
  2. ContactDetails için tek bağımsız değişkenin Contact türünde olduğunu tespit eder.
  3. Contact sabit bir veri sınıfı olduğundan Compose, ContactDetails için hiçbir bağımsız değişkenin değişmediğinden emin olur.
  4. Bu nedenle Oluştur, ContactDetails öğesini atlar ve onu yeniden oluşturmaz.
  5. Diğer yandan, ToggleButton için bağımsız değişkenler değişmiştir ve Composer, bu bileşeni yeniden oluşturur.

Değişebilir nesneler

Yukarıdaki örnekte sabit bir nesne kullanılsa da değişken nesne oluşturmak da mümkündür. Aşağıdaki snippet'i inceleyin:

data class Contact(var name: String, var number: String)

Contact parametresinin her bir parametresi artık var olduğundan sınıf artık sabit değil. Özellikleri değiştiyse Compose bunu fark etmez. Bunun nedeni, Oluşturma özelliğinin yalnızca Oluşturma Durum nesnelerinde yapılan değişiklikleri izlemesidir.

Compose bu tür bir sınıfı kararsız olarak kabul ediyor. Oluşturma işlemi kararlı olmayan sınıfların yeniden oluşturulmasını atlamaz. Dolayısıyla, Contact bu şekilde tanımlanmışsa önceki örnekte ContactRow, selected her değiştiğinde yeniden oluşturur.

Compose'da uygulama

Çok önemli olmasa da, Compose'un yeniden oluşturma sırasında hangi işlevlerin atlanacağını tam olarak nasıl belirlediğini dikkate almak faydalı olabilir.

Compose derleyicisi kodunuzda çalıştırıldığında, her işlevi ve türü birkaç etiketten biriyle işaretler. Bu etiketler, Compose'un yeniden oluşturma sırasında işlevi veya türü nasıl işleyeceğini yansıtır.

Fonksiyonlar

Oluşturma, işlevleri skippable veya restartable olarak işaretleyebilir. Bir fonksiyonu aşağıdakilerden biri, her ikisi olarak veya her ikisi olarak işaretleyebilirsiniz:

  • Atlanabilir: Derleyici bir composable'ı atlanabilir olarak işaretlerse tüm bağımsız değişkenleri önceki değerlerine eşit olduğunda Compose yeniden oluşturma sırasında bunu atlayabilir.
  • Yeniden başlatılabilir: Yeniden başlatılabilen bir composable, yeniden oluşturma işleminin başlayabileceği bir "kapsam" görevi görür. Başka bir deyişle, işlev, Compose'un durum değişikliklerinden sonra yeniden derleme için kodu yeniden yürütmeye başlayabileceği bir giriş noktası olabilir.

Türler

Türleri sabit veya kararlı olarak işaretleyin. Her iki tür de ikisinden biridir:

  • Sabit: Oluşturma, özelliklerinin değeri hiçbir zaman değişemiyorsa ve tüm yöntemler başvurusal olarak şeffafsa bir türü sabit olarak işaretler.
    • Tüm temel öğelerin sabit olarak işaretlendiğini unutmayın. Bunlara String, Int ve Float dahildir.
  • Kararlı: Yapım sonrasında özellikleri değişebilen bir türü belirtir. Çalışma zamanında bu özellikler değişirse ve Compose bu değişikliklerden haberdar olur.

Hata ayıklama kararlılığı

Uygulamanız parametreleri değişmemiş bir composable'ı yeniden oluşturuyorsa öncelikle açıkça değişebilir parametrelerin tanımını kontrol edin. var özelliklerine sahip bir tür veya bilinen bir kararsız türü kullanan bir val özelliği iletirseniz Compose her zaman bir bileşeni yeniden oluşturur.

Composer'da 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üzeltin

Compose uygulamanızda kararlılığı tutarlı hale getirme 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 hangi composable'ları atlaması gerektiğini belirlemek için composable'larınızın her bir parametresinin kararlılığını belirler.
  • Hemen yapılan düzeltmeler: composable'ın atlanmadığını fark ederseniz ve bu durum performans sorununa neden oluyorsa öncelikle var parametreleri gibi kararsızlığın bariz nedenlerini kontrol etmeniz gerekir.
  • Derleyici raporları: Sınıflarınızla ilgili çıkarımda bulunulan kararlılığı belirlemek için derleyici raporlarını kullanabilirsiniz.
  • Koleksiyonlar: Oluşturma işlemi, List, Set ve Map gibi koleksiyon sınıflarını her zaman kararsız olarak kabul eder. Bunun nedeni, bunların sabit olacağı garanti edilememesidir. Bunun yerine Kotlinx sabit koleksiyonlarını kullanabilir ya da sınıflarınıza @Immutable veya @Stable olarak ek açıklama ekleyebilirsiniz.
  • Diğer modüller: Compose derleyicinin çalışmadığı modüllerde bulunduklarında her zaman kararsız olduğunu düşünür. Gerekirse sınıfları kullanıcı arayüzü model sınıflarında sarmalayın.

Daha fazla bilgi