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
):
- Narzędzie Compose sprawdza, czy powinno ponownie skomponować kod wewnątrz elementu
ContactRow
. - Widać, że jedyny argument funkcji
ContactDetails
jest typuContact
. - Ponieważ
Contact
jest stałą klasą danych, funkcja Compose zapewnia, że żadne z argumenty funkcjiContactDetails
zmieniły się. - W związku z tym funkcja tworzenia wiadomości pomija element
ContactDetails
i nie tworzy go ponownie. - 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
iFloat
.
- Pamiętaj, że wszystkie typy podstawowe są oznaczone jako stałe. Obejmują one:
- 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
iMap
. 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
- Wydajność: więcej wskazówek dotyczących debugowania wydajności tworzenia wiadomości znajdziesz w naszym przewodniku po sprawdzonych metodach i prezentacji na I/O.