Stabilität in der Funktion „Schreiben“

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:

  1. Mit „Compose“ wird ausgewertet, ob der Code in ContactRow neu zusammengesetzt werden soll.
  2. Das einzige Argument für ContactDetails ist Contact.
  3. Da Contact eine unveränderliche Datenklasse ist, stellt Compose sicher, dass keine der Die Argumente für ContactDetails haben sich geändert.
  4. Dabei wird ContactDetails übersprungen und es wird nicht neu zusammengesetzt.
  5. 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 und Float.
  • 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 und Map. 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