Stabilność tworzenia wiadomości

Typ tworzenia jest określany jako stały lub niestabilny. Typ jest stabilny, jeśli jest stały lub jeśli można ustalić, czy jego wartość zmieniała się w przypadku kolejnych zmian kompozycji. Typ jest niestabilny, jeśli nie może stwierdzić, czy jego wartość zmieniła się pomiędzy kolejnymi kompozycjami.

Funkcja tworzenia zależy od stabilności parametrów elementu kompozycyjnego, aby określić, czy element ten można pominąć podczas zmieniania kompozycji:

  • Parametry stabilne: jeśli funkcja kompozycyjna ma stabilne parametry, które się nie zmieniły, funkcja Compose będzie je pomijać.
  • Niestabilne parametry: jeśli funkcja kompozycyjna ma niestabilne parametry, funkcja Utwórz zawsze tworzy ją ponownie podczas tworzenia elementu nadrzędnego komponentu.

Jeśli aplikacja zawiera wiele niepotrzebnie niestabilnych komponentów, które zawsze się tworzy, mogą wystąpić problemy z wydajnością i innymi problemami.

Z tego dokumentu dowiesz się, jak zwiększyć stabilność aplikacji, aby poprawić jej wydajność i ogólne wrażenia.

Obiekty stałe

Poniższe fragmenty kodu obrazują ogólne zasady stabilności i rekompozycji.

Klasa Contact jest trwałą klasą danych. Wynika to z faktu, że wszystkie jego parametry są prymitywami zdefiniowanymi w słowie kluczowym val. Po utworzeniu wystąpienia obiektu Contact nie możesz zmieniać wartości jego właściwości. Jeśli chcesz to zrobić, musisz 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, a stan elementu selected zmieni się:

  1. Funkcja Compose ocenia, czy powinna ponownie skomponować kod w obrębie ContactRow.
  2. Widać, że jedyny argument ContactDetails jest typu Contact.
  3. Contact jest trwałą klasą danych, dlatego funkcja Compose ma pewność, że żaden z argumentów ContactDetails nie uległ zmianie.
  4. W związku z tym funkcja tworzenia pomija element ContactDetails i nie tworzy go ponownie.
  5. Z drugiej strony argumenty wartości ToggleButton uległy zmianie i komponent Utwórz ponownie.

Zmienne obiekty

Chociaż w poprzednim przykładzie korzystamy z obiektu stałego, można utworzyć obiekt zmienny. Rozważ ten fragment kodu:

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

Każdy parametr obiektu Contact jest teraz var, więc klasa nie jest już stała. Jeśli jego właściwości się zmienią, funkcja tworzenia nie będzie tego wiedzieć. Dzieje się tak, ponieważ funkcja tworzenia śledzi tylko zmiany w obiektach State w komponencie Compose.

Tworzenie uważa, że taka klasa jest niestabilna. Tworzenie nie pomija zmiany układu niestabilnych klas. Jeśli więc właściwość Contact została określona w ten sposób, funkcja ContactRow w poprzednim przykładzie utworzyłaby każdą zmianę parametru selected.

Implementacja w tworzeniu

Warto się zastanowić, w jaki sposób funkcja Utwórz określa, które funkcje są pomijane podczas zmiany kompozycji, chociaż nie jest to kluczowe.

Gdy kompilator Compose działa w Twoim kodzie, oznacza każdą funkcję i typ za pomocą jednego z kilku tagów. Te tagi pokazują, jak funkcja Utwórz obsługuje funkcję lub pisanie podczas zmiany kompozycji.

Funkcje

Tworzenie wiadomości może oznaczać funkcje jako skippable lub restartable. Funkcja może oznaczyć funkcję jako jedną, oba te elementy lub żadna z nich:

  • Możliwe do pominięcia: jeśli kompilator oznaczy element kompozycyjny jako możliwy do pominięcia, funkcja Compose może go pominąć podczas ponownego komponowania, jeśli wszystkie jego argumenty są równe ich wcześniejszym wartościom.
  • Możliwość ponownego uruchamiania: element kompozycyjny, który można ponownie uruchomić, stanowi „zakres”, w którym może się rozpocząć zmiana. Inaczej mówiąc, funkcja może być punktem wejścia, w którym funkcja Compose może zacząć ponownie wykonywać kod do zmiany kompozycji po zmianie stanu.

Rodzaje

Podczas tworzenia oznaczasz typy jako stałe lub stabilne. Każdy z nich oznacza jeden lub drugi:

  • Stałe: funkcja tworzenia oznacza typ jako stały, jeśli wartości jego właściwości nigdy się nie zmienią, a wszystkie metody są zazwyczaj przejrzyste.
    • Pamiętaj, że wszystkie typy podstawowe są oznaczone jako stałe. Są to między innymi: String, Int i Float.
  • Stabilna: wskazuje typ, którego właściwości mogą się zmienić po budowie. Jeśli właściwości te ulegną zmianie w czasie działania, funkcja tworzenia zostanie świadoma tych zmian.

Debuguj stabilność

Jeśli Twoja aplikacja ponownie komponuje element kompozycyjny, którego parametry się nie zmieniły, najpierw sprawdź jego definicję pod kątem parametrów, które można łatwo zmieniać. Tworzenie zawsze ponownie komponuje komponent, jeśli przekazujesz typ z właściwościami var, lub właściwość val, która używa znanego niestabilnego typu.

Szczegółowe informacje o diagnozowaniu złożonych problemów ze stabilnością w komponencie znajdziesz w przewodniku na temat stabilności debugowania.

Rozwiąż problemy ze stabilnością

Informacje o tym, jak zwiększyć stabilność implementacji tworzenia wiadomości, znajdziesz w przewodniku Rozwiązywanie problemów ze stabilnością.

Podsumowanie

Ogólnie warto pamiętać o tych kwestiach:

  • Parametry: Compose określa stabilność poszczególnych parametrów funkcji kompozycyjnych, by określić, które elementy kompozycyjne mają być pomijane podczas zmiany kompozycji.
  • Natychmiastowe poprawki: jeśli zauważysz, że funkcja kompozycyjna nie jest pomijana i powoduje problem z wydajnością, najpierw sprawdź oczywiste przyczyny niestabilności, np. parametry var.
  • Raporty kompilatora: za pomocą raportów kompilatora możesz określić, jaka jest stabilność klas.
  • Kolekcje: funkcja tworzenia zawsze traktuje klasy kolekcji jako niestabilne, np. List, Set i Map. Dzieje się tak, ponieważ nie można zagwarantować, że są stałe. Zamiast nich możesz używać kolekcji stałych Kotlinx lub dodawać do zajęć adnotacje przy użyciu atrybutów @Immutable lub @Stable.
  • Inne moduły: w miejscach, w których kompilator Compose nie działa, zawsze uważa, że funkcja ta jest niestabilna. W razie potrzeby pakuj klasy w klasach modelu UI.

Więcej materiałów