Easy Reactive State Management und ViewModels für Kotlin -Multiplattform. Kein Kessel. Kompatibel mit Android.
Reactivestate-Kotlin liefert diese Fundamente für den Aufbau von Multiplatform-ViewModels und Logik auf niedrigerer Ebene:
CoroutineDispatcher S überall zu übergebenWeitere Informationen finden Sie in der Reaktivitätsdokumentation.
Android, JVM, iOS, TVOS, Watchos, macosarm64, macOSX64, Mingwx64, Linuxx64
Fügen Sie das Paket Ihrem build.gradle hinzu. Gradle's dependencies {} :
dependencies {
// Add the BOM using the desired ReactiveState version
api platform( " com.ensody.reactivestate:reactivestate-bom:VERSION " )
// Leave out the version number from now on:
implementation " com.ensody.reactivestate:reactivestate "
// Utils for unit tests that want to use coroutines
implementation " com.ensody.reactivestate:reactivestate-test "
// Note: kotlin-coroutines-test only supports the "jvm" target,
// so reactivestate-test has the same limitation
} Stellen Sie außerdem sicher, dass Sie das Maven Central Repo, z. B. in Ihren Root build.gradle integriert haben. Gradle:
subprojects {
repositories {
// ...
mavenCentral()
// ...
}
}Die folgenden zwei Prinzipien geben Ihnen nur eine kurze Vorstellung von dem reaktiven Programmieraspekt. Der Abschnitt "Leitfaden" in der Dokumentation beschreibt, wie man mit den fortgeschritteneren Aspekten wie Multiplattform -ViewModels, Lebenszyklushandling usw. arbeitet.
HINWEIS: Während es in der Diskussion um StateFlow geht, können Sie auch LiveData verwenden oder sogar Erweiterungen für andere beobachtbare Werte implementieren.
Stellen Sie sich vor, Sie haben ein Eingangsformular mit dem ersten und Nachnamen und möchten gleichzeitig zwei StateFlow -Werte beobachten:
isFirstNameValid: StateFlow<Boolean>isLastNameValid: StateFlow<Boolean> So würden Sie es tun, indem Sie die autoRun -Funktion verwenden:
autoRun {
submitButton.isEnabled = get(isFirstNameValid) && get(isLastNameValid)
} Mit get(isFirstNameValid) rufen Sie isFirstNameValid.value ab und sagen Sie autoRun gleichzeitig, den Block erneut auszusetzen, wenn der Wert geändert wird. Dieser Code ähnelt dem Schreiben:
lifecycleScope.launchWhenStarted {
isFirstNameValid
.combine(isLastNameValid) { firstNameValid, lastNameValid ->
firstNameValid to lastNameValid
}
.conflate()
.collect { (firstNameValid, lastNameValid) ->
try {
submitButton.isEnabled = firstNameValid && lastNameValid
} catch (e : CancellationException ) {
throw e
} catch (e : Throwable ) {
onError(e)
}
}
} Das gleiche Prinzip kann verwendet werden, um einen derived reaktiven StateFlow zu erstellen:
val isFormValid : StateFlow < Boolean > = derived {
get(isFirstNameValid) && get(isLastNameValid)
} Jetzt können Sie autoRun { submitButton.isEnabled = get(isFormValid) } im Rest Ihres Codes verwenden.
Wenn Sie noch weiter gehen, ist isFirstNameValid selbst normalerweise auch das Ergebnis einer derived Berechnung. Sie können also mehrere reaktive staatliche Schichten von derived StateFlow haben.
Reaktive UI -Frameworks wie Jetpack komponieren die Benutzeroberfläche automatisch, wenn sich ein StateFlow ändert. In der UI -Schicht kann autoRun normalerweise durch einen Composable ersetzt werden.
Unter der Benutzeroberfläche müssen Ihre Daten jedoch auch noch reaktiv sein. Hier ist Reactivestate zur Verfügung, die zur automatischen Neuberechnung eines StateFlow basierend auf anderen StateFlow derived . Dieses Muster ist in der Praxis sehr nützlich und bietet die perfekte Grundlage für Frameworks wie Jetpack Compose, die sich hauptsächlich auf den UI -Aspekt konzentrieren. derived und autoRun von Reactivestate bieten die gleiche Reaktivität für Ihre Daten und Ihre Geschäftslogik.
In Jetpack haben Sie sogar derivedStateOf was dem derived sehr ähnlich ist. Sie können also auswählen, ob Sie Ihre Geschäftslogik basierend auf der offiziellen Coroutines -Bibliothek ( StateFlow / derived ) oder Jetpack -Kompose ( State / derivedStateOf ) erstellen möchten. Die Coroutines -Bibliothek hat jedoch den Vorteil, dass sie für mehr Plattformen verfügbar ist und von allen UI -Frameworks unabhängig ist. Schließlich werden die meisten Open-Source-Nicht-UI-Bibliotheken wahrscheinlich auf Coroutinen basieren, sodass der Code auf StateFlow basierten Code auch für Kompatibilität/Interoperabilität besser ist.
Mit anderen Worten, die Kombination beider Lösungen, die zusammen verwendet werden, führt zu einer vollständig reaktiven Multiplattform -Codebasis, die die Codebeinfachheit verbessert und viele Fehler vermeidet.
Darüber hinaus bietet Jetpack Compose derzeit keine Multiplattform-ViewModel-Unterstützung oder eine großflächige Architektur. Diese Bibliothek löst dies durch die Bereitstellung BaseReactiveState für ViewModels. Es wird außerdem mit einem Lebenszyklusereignissystem ( eventNotifier ) und Ladezustandsbehandlung geliefert (so können Sie einen oder mehrere verschiedene Ladeindikatoren basierend auf den von Ihnen gestarteten Koroutinen verfolgen).
Diese Bibliothek basiert auf Reactive_State für Flattern und adaptiert an Kotlin -Multiplattform- und Android -Muster.
Copyright 2024 Ensody GmbH, Waldemar Kornewald
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.