Stabilność tworzenia wiadomości

Funkcja tworzenia wiadomości uznaje typy za stabilne lub niestabilne. Typ jest niezmienny, jeśli jest niezmienna lub czy funkcja Compose może sprawdzić, czy jego wartość które zmieniały się między kolejnymi kompozycjami. Typ jest niestabilny, jeśli funkcja Utwórz nie wie, czy jego wartość uległa zmianie między kolejnymi zmianami.

Funkcja tworzenia korzysta ze stabilności parametrów funkcji kompozycyjnej, aby określić, czy może pominąć kompozycję podczas ponownego komponowania:

  • Parametry stabilne: jeśli funkcja kompozycyjna ma stałe parametry, które nie mają jest pomijany,
  • Parametry niestabilne: jeśli funkcja kompozycyjna ma niestabilne parametry, funkcja Utwórz zawsze tworzy ją ponownie, gdy ponownie tworzy element nadrzędny komponentu.

Jeśli aplikacja zawiera wiele niepotrzebnie niestabilnych komponentów, funkcja Compose zawsze jest dostępna ponowne utworzenie raportu, mogą wystąpić problemy z wydajnością i inne.

Z tego dokumentu dowiesz się, jak możesz zwiększyć stabilność aplikacji, wydajność i ogólne wrażenia użytkownika.

Obiekty stałe

Poniższe fragmenty pokazują ogólne zasady dotyczące stabilności zmianę kompozycji.

Klasa Contact jest stałą klasą danych. To dlatego, że wszystkie to elementy podstawowe zdefiniowane za pomocą słowa kluczowego val. Po utworzeniu instancji Contact, nie można zmienić wartości właściwości obiektu. W takim przypadku należy utworzyć nowy obiekt.

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

Funkcja kompozycyjna ContactRow ma parametr typu Contact.

@Composable
fun ContactRow(contact: Contact, modifier: Modifier = Modifier) {
   var selected by remember { mutableStateOf(false) }

   Row(modifier) {
      ContactDetails(contact)
      ToggleButton(selected, onToggled = { selected = !selected })
   }
}

Zastanów się, co się stanie, gdy użytkownik kliknie przycisk przełączania, Zmiany stanu (selected):

  1. Narzędzie Compose sprawdza, czy powinno ponownie skomponować kod wewnątrz elementu ContactRow.
  2. Widać, że jedyny argument funkcji ContactDetails jest typu Contact.
  3. Ponieważ Contact jest stałą klasą danych, funkcja Compose zapewnia, że żadne z argumenty funkcji ContactDetails zmieniły się.
  4. W związku z tym funkcja tworzenia wiadomości pomija element ContactDetails i nie tworzy go ponownie.
  5. Z drugiej strony argumenty funkcji ToggleButton uległy zmianie, Utwórz ponownie ten komponent.

Zmienne obiekty

Podczas gdy w poprzednim przykładzie użyto obiektu stałego, można utworzyć zmiennym obiektem. Przyjrzyjmy się temu fragmentowi:

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

Każdy parametr parametru Contact to teraz var, więc klasy nie można już zmienić. Gdyby jego właściwości uległy zmianie, funkcja tworzenia wiadomości nie byłaby rozpoznawana. Dzieje się tak, ponieważ Funkcja tworzenia wiadomości śledzi tylko zmiany obiektów stanu tej funkcji.

Funkcja Compose uznaje taką klasę za niestabilną. W trakcie tworzenia wiadomości nie pomijane są ponowne kompozycje klas niestabilnych. Jeśli więc właściwość Contact została określona w ten sposób, ContactRow w poprzednim przykładzie byłaby przenoszona po każdej zmianie wartości selected.

Implementacja w Compose

Zastanowienie się, jak dokładnie opracować określa, które funkcje mają być pomijane podczas zmiany kompozycji.

Gdy w kodzie działa kompilator Compose, oznaczy każdą funkcję i typ jednym z kilku tagów. Te tagi odzwierciedlają sposób, w jaki element Utwórz obsługuje funkcję lub możesz wpisać podczas zmiany kompozycji.

Funkcje

W trakcie tworzenia wiadomości możesz oznaczać funkcje jako skippable lub restartable. Pamiętaj, że może ono oznacz funkcję jako jedną, obie lub żaden z tych elementów:

  • Możliwe do pominięcia: jeśli kompilator oznaczy utwór kompozycyjny jako możliwy do pominięcia, możesz go pominąć podczas zmiany kompozycji, jeśli wszystkie jego argumenty są równe poprzednich wartości.
  • Możliwość ponownego uruchomienia: funkcja kompozycyjna, którą można ponownie uruchomić, służy jako „zakres”. gdzie może rozpocząć się ponowne kompozycje. Innymi słowy, funkcja może być punktem wpis określający miejsce, w którym funkcja tworzenia może rozpocząć ponowne wykonywanie kodu w celu zmiany kompozycji po zmian stanu.

Typy

Typy tworzenia są oznaczane jako stałe lub stabilne. Każdy typ to jeden lub inna:

  • Stały: funkcja Compose oznacza typ jako niezmienny, jeśli wartość jego właściwości nigdy się nie zmieniają, a wszystkie metody są przez nas przejrzyste.
    • Pamiętaj, że wszystkie typy podstawowe są oznaczone jako stałe. Obejmują one: String, Int i Float.
  • Stabilna: wskazuje typ, którego właściwości mogą się zmieniać po utworzeniu obiektu. Jeśli te właściwości zmienią się w trakcie działania, funkcja tworzenia wiadomości otrzyma informację o tych zmian.
.

Stabilność debugowania

Jeśli Twoja aplikacja ponownie komponuje funkcję kompozycyjną, której parametry się nie zmieniły, najpierw sprawdzić jego definicję pod kątem parametrów, które są wyraźnie zmienne. Twórz zawsze ponownie komponuje komponent, jeśli przekażesz typ z właściwościami var lub val o znanym typie niestabilnym.

Szczegółowe informacje o diagnozowaniu złożonych problemów ze stabilnością w Napisz wiadomość o stabilności debugowania w przewodniku.

Rozwiązywanie problemów ze stabilnością

Informacje o tym, jak zapewnić stabilność implementacji usługi Compose, znajdziesz w artykule przewodnik po rozwiązywaniu problemów ze stabilnością.

Podsumowanie

Ogólnie należy wziąć pod uwagę następujące kwestie:

  • Parametry: funkcja Compose określa stabilność każdego parametru parametru elementów kompozycyjnych określających, które kompozycje mają być pomijane. zmianę kompozycji.
  • Natychmiastowe poprawki: jeśli zauważysz, że funkcja kompozycyjna nie jest pomijana i powoduje problemy z wydajnością, sprawdź oczywiste przyczyny niestabilność, np. parametry var.
  • Raporty kompilatora: możesz używać raportów kompilatora, aby: określają stabilność zajęć.
  • Kolekcje: funkcja tworzenia zawsze uważa klasy kolekcji za niestabilne, takie jak jako List, Set i Map. Dzieje się tak, ponieważ nie można zagwarantować, że są stałe. Zamiast tego możesz użyć kolekcji stałych Kotlinx lub dodawaj adnotacje do zajęć przy użyciu: @Immutable lub @Stable.
  • Inne moduły: funkcja Compose zawsze traktuje jako niestabilną lokalizację, w której pochodzą modułów, w których kompilator Compose nie działa. Zapakuj zajęcia w interfejsie klas modeli, jeśli są one wymagane.

Więcej materiałów