Wie aktualisiert er den Wert des übergeordneten Werts, wenn der Zustand in Jetpack komponiert wird, obwohl nichts vom KiAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 Wie aktualisiert er den Wert des übergeordneten Werts, wenn der Zustand in Jetpack komponiert wird, obwohl nichts vom Ki

Post by Anonymous »

Hintergrund
hi, ich habe kürzlich eine Verwendung für Kotlin und Kotlin Multi Platform (KMP) gefunden, die Jetpack Compose verwendet. Ich bin bei beiden ziemlich neu, aber nicht programmieren. Jetzt eignet sich der folgende Code gut für das Heben des Zustands, aber ich möchte verstehen, warum, weil ich nicht sehe, wie das Kind mit dem übergeordneten verbunden ist.

Code: Select all

@Composable
fun Parent() {
var count by rememberSaveable { mutableStateOf(0) }
Child(count, { count++ })
}

@Composable
fun Child(count, buttonPressed: () -> Unit) {
Text("Clicked $count times")
Button(onClick = buttonPressed, Modifier.padding(100.dp)) {
// if I do println("here"), the following Text() will only run once,
// so this part of the UI isn't rewritten on subsequent clicks
Text("Click to add")
}
}

@Composable
fun App() {
Parent()
}

fun main() = application {
Window(
onCloseRequest = ::exitApplication,
title = "MyProgramTitle",
) {
App()
}
}
Ich würde erwarten, dass Konstruktoren wie diese bei der Erhöhung des Grafen funktionieren, aber sie tun es nicht. Ich entferne den zusätzlichen Code für die Kürze:

Code: Select all

Parent(increaseBy=0)

// Inside Child()...
Button(onClick = Parent(increaseBy=1))
< /code>
In den Dokumenten werden die folgenden Schaltflächen < /code> Composeable sagen: < /p>

"Schaltflächen sind grundlegende Komponenten, die es dem Benutzer ermöglichen, eine definierte Aktion auszulösen.onClick< /code> sagt Folgendes: < /p>

"Die Funktion, die das System beim Drücken der Taste aufruft. Es wird kein int 
oder ein Datentyp übergeben. Es gibt nur ein Einheit aus, und es wird definitiv nicht übergeordnet () mit irgendwelchen Argumenten aufgerufen. Es gibt keine Parameter in seinem Konstruktor, aber es aktualisiert übergeordnete. Count . Wie????? Dies bläst mich um. Ein Lambda: Buttonpressed: () -> Einheit muss nur diesen Test abfeuern, auch wenn er leer ist ... Dieser Test aus dem Kind sprudelt dann auf und sieht, dass es eine Variable hat, die sich ändern muss: Text ("Klickte $ count Times") , und es hat ein übergeordnetes, das übergeordnet ist, das es in der Lage ist. /> Wenn dies der Fall ist, bläst ich mich um, warum sie Sie nicht einfach so etwas wie Taste machen lassen (Onclick = Eltern (erhöht = 1)) < /code>. Das wäre so viel einfacher und weniger verwirrend, aber ich erinnere mich, dass ich etwas darüber gelesen habe, wie beabsichtigt es war, die Dinge auf diese Weise zu tun, sodass der Code leichter zu pflegen war (einzelne Quelle der Wahrheit, gemeinsam genutzt, abgefangen, entkoppelt usw.).
Wie aktualisiert es die Anzahl ??
Antwort
Ich habe die Antwort unten akzeptiert, weil es mir einige Einblicke gab, aber dieser könnte Menschen helfen, die neuer für Kotlin sind. Eltern, diese Werte werden an das Kind weitergegeben, und Ereignisse des Kindes gehen zum Elternteil. Im Kind ist Onclick ein leeres Lambda, und der Elternteil nimmt keine Parameter ein. Nichts verbindet es mit den Eltern, wie Sie es mit so etwas erwarten würden: Onclick = Parent (erhöht = 1) ...
, aber es aktualisiert die Anzahl innerhalb des übergeordneten, da es nur umkennende Komponabsabläufe komponieren, die sich ändern können. Alles andere wird übersprungen. Wenn Sie meinen Kommentar in der Schaltfläche sehen, wird dieser komponierbare nur das erste Mal ausgeführt, da es keine Variablen enthält, die sich ändern können. Und dieser Ereignishandler, obwohl es standardmäßig ein leeres Lambda benötigt, ist dies nur der Auslöser für das Komponieren, um nach neuen möglichen UI -Änderungen zu suchen. Kind mit der Lambda dort {count ++} .
So werden der Zustand und die Benutzeroberfläche immer getrennt.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post