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()
}
}
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
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.