In Compose werden Typen entweder als stabil oder instabil eingestuft. Ein Typ ist stabil, wenn er unveränderlich ist oder bei "Compose" erkannt werden kann, ob ihr Wert zwischen den Neuzusammensetzungen geändert. Ein Typ ist instabil, wenn Compose nicht weiß, ob hat sich der Wert zwischen den Neuzusammensetzungen geändert.
Bei "Compose" wird anhand der Stabilität der Parameter einer zusammensetzbaren Funktion ermittelt, kann die zusammensetzbare Funktion bei der Neuzusammensetzung überspringen:
- Stabile Parameter:Wenn eine zusammensetzbare Funktion stabile Parameter hat, geändert hat, wird der Text beim Schreiben übersprungen.
- Instabile Parameter:Wenn eine zusammensetzbare Funktion instabile Parameter enthält, verwenden Sie die Funktion „Compose“ setzt sie immer neu zusammen, wenn sie das übergeordnete Element der Komponente neu zusammensetzt.
Wenn deine App viele unnötig instabile Komponenten enthält, erstellt die Compose-Funktion immer Zusammensetzungen auftreten, können Leistungsprobleme und andere Probleme auftreten.
In diesem Dokument wird beschrieben, wie du die Stabilität deiner App verbessern kannst. und User Experience insgesamt.
Unveränderliche Objekte
Die folgenden Snippets veranschaulichen die allgemeinen Prinzipien für Stabilität und Neuzusammensetzung.
Die Contact
-Klasse ist eine unveränderliche Datenklasse. Der Grund dafür ist,
Parameter sind Primitive, die mit dem Schlüsselwort val
definiert werden. Sobald Sie ein
Instanz von Contact
können Sie den Wert der Eigenschaften des Objekts nicht ändern.
In diesem Fall würden Sie ein neues -Objekt erstellen.
data class Contact(val name: String, val number: String)
Die zusammensetzbare Funktion ContactRow
hat einen Parameter vom Typ Contact
.
@Composable
fun ContactRow(contact: Contact, modifier: Modifier = Modifier) {
var selected by remember { mutableStateOf(false) }
Row(modifier) {
ContactDetails(contact)
ToggleButton(selected, onToggled = { selected = !selected })
}
}
Überlegen Sie, was passiert, wenn die Nutzenden auf die Ein/Aus-Schaltfläche klicken und
selected
-Statusänderungen:
- Mit „Compose“ wird ausgewertet, ob der Code in
ContactRow
neu zusammengesetzt werden soll. - Das einzige Argument für
ContactDetails
istContact
. - Da
Contact
eine unveränderliche Datenklasse ist, stellt Compose sicher, dass keine der Die Argumente fürContactDetails
haben sich geändert. - Dabei wird
ContactDetails
übersprungen und es wird nicht neu zusammengesetzt. - Andererseits haben sich die Argumente für
ToggleButton
geändert und „Compose“ setzt die Komponente neu zusammen.
Veränderliche Objekte
Während im vorherigen Beispiel ein unveränderliches Objekt verwendet wird, ist es möglich, ein änderbares Objekt. Sehen Sie sich das folgende Snippet an:
data class Contact(var name: String, var number: String)
Da jeder Parameter von Contact
jetzt ein var
ist, ist die Klasse nicht mehr unveränderlich.
Wenn sich die Eigenschaften ändern, wird Compose nicht erkannt. Das liegt daran,
Mit „Compose“ werden nur Änderungen an „Compose“-Zustandsobjekten verfolgt.
Compose betrachtet diese Klasse als instabil. Beim Schreiben wird die Neuzusammensetzung
instabilen Klassen. Wenn Contact
also so definiert werden würde, würde ContactRow
im vorherigen Beispiel bei jeder Änderung von selected
neu zusammengesetzt werden.
Implementierung in Compose
Es kann zwar hilfreich, aber nicht entscheidend sein, bestimmt, welche Funktionen bei der Neuzusammensetzung übersprungen werden.
Wenn der Compose-Compiler für Ihren Code ausgeführt wird, markiert er jede Funktion und jeden Typ mit einem von mehreren Tags. Diese Tags geben an, wie Compose die Funktion oder bei der Neuzusammensetzung.
Funktionen
Mit „Compose“ können Funktionen als skippable
oder restartable
markiert werden. Beachten Sie, dass es möglicherweise
eine Funktion als eine, beide oder keine der folgenden Optionen markieren:
- Überspringbar: Wenn der Compiler eine zusammensetzbare Funktion als überspringbar markiert, kann „Compose“ und können sie bei der Neuzusammensetzung überspringen, wenn alle Argumente mit ihren vorherigen Werte.
- Neustartbar: Eine zusammensetzbare Funktion, die neu gestartet werden kann, dient als „Bereich“ Wo? kann eine Neuzusammensetzung beginnen. Mit anderen Worten, die Funktion kann ein Punkt Eintrag, über den Compose Code zur Neuzusammensetzung erneut ausführen kann Statusänderungen.
Typen
Mit „Compose“ werden Typen als unveränderlich oder stabil markiert. Jeder Typ entspricht einem oder Andere:
- Unveränderlich: Durch „Compose“ wird ein Typ als unveränderlich markiert, wenn der Wert seines
Eigenschaften können sich nie ändern und alle Methoden sind referenzen transparent.
- Beachten Sie, dass alle primitiven Typen als unveränderlich markiert sind. Dazu gehören:
String
,Int
undFloat
.
- Beachten Sie, dass alle primitiven Typen als unveränderlich markiert sind. Dazu gehören:
- Stabil: Gibt einen Typ an, dessen Eigenschaften sich nach der Konstruktion ändern können. Falls und wenn sich diese Eigenschaften während der Laufzeit ändern, erkennt Compose Änderungen vornehmen.
Stabilität der Fehlerbehebung
Wenn Ihre App eine zusammensetzbare Funktion neu erstellt, deren Parameter sich nicht geändert haben,
die Definition für Parameter zu überprüfen,
die eindeutig veränderbar sind. Immer schreiben
setzt eine Komponente neu zusammen, wenn Sie einen Typ mit var
-Eigenschaften oder einen val
-Wert übergeben.
die einen bekannten instabilen Typ verwenden.
Ausführliche Informationen zur Diagnose komplexer Stabilitätsprobleme in Weitere Informationen zum Erstellen finden Sie im Leitfaden zur Stabilität bei der Fehlerbehebung.
Stabilitätsprobleme beheben
Informationen zur Stabilität Ihrer Compose-Implementierung finden Sie unter im Leitfaden Stabilitätsprobleme beheben.
Zusammenfassung
Insgesamt sollten Sie die folgenden Punkte beachten:
- Parameter: Zusammensetzung bestimmt die Stabilität der einzelnen Parameter Ihres zusammensetzbare Funktionen, um zu bestimmen, welche zusammensetzbaren Funktionen übersprungen werden sollen Neuzusammensetzung.
- Sofortige Fehlerbehebung: Wenn Sie feststellen, dass die zusammensetzbare Funktion nicht übersprungen wird und
ein Leistungsproblem verursacht, sollten Sie die offensichtlichen Ursachen
z. B.
var
-Parameter, zuerst instabil. - Compiler-Berichte: Mit den Compiler-Berichten können Sie Folgendes tun: um zu bestimmen, welche Stabilität aus Ihren Klassen abgeleitet wird.
- Collections (Sammlungen): In Compose werden Sammlungsklassen immer als instabil betrachtet, z. B.
als
List, Set
undMap
. Das liegt daran, dass nicht garantiert werden kann, sind unveränderlich. Sie können stattdessen unveränderliche Kotlinx-Sammlungen verwenden oder Ihre Klassen als@Immutable
oder@Stable
annotieren. - Andere Module: Der Ursprungsort von Compose wird immer als instabil eingestuft Module, in denen der Compose-Compiler nicht ausgeführt wird. Klassen in UI umschließen Modellklassen bei Bedarf.
Weitere Informationen
- Leistung: Weitere Tipps zur Fehlerbehebung zur Leistung von „Compose“ findest du in im Best Practices-Leitfaden und im I/O-Talk.