Manajemen negara reaktif yang mudah dan viewmodels untuk multiplatform Kotlin. Tidak ada boilerplate. Kompatibel dengan Android.
ReactiveState-Kotlin menyediakan fondasi ini untuk membangun viewmodels multiplatform dan logika tingkat bawah:
CoroutineDispatcher di mana-manaLihat dokumentasi reaktivestate untuk lebih jelasnya.
Android, JVM, iOS, TVOS, WatchOS, Macosarm64, Macosx64, MingWX64, Linuxx64
Tambahkan paket ke dependensi build.gradle Anda 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
} Juga, pastikan Anda telah mengintegrasikan repo Maven Central, misalnya dalam root build.gradle Anda.
subprojects {
repositories {
// ...
mavenCentral()
// ...
}
}Dua prinsip berikut ada di sini untuk memberi Anda gambaran singkat tentang aspek pemrograman reaktif saja. Bagian "panduan" dalam dokumentasi menjelaskan cara bekerja dengan aspek yang lebih canggih seperti viewmodels multiplatform, penanganan siklus hidup, dll.
CATATAN: Sementara diskusi adalah tentang StateFlow , Anda juga dapat menggunakan LiveData atau bahkan mengimplementasikan ekstensi untuk nilai -nilai yang dapat diamati lainnya.
Bayangkan Anda memiliki formulir input dengan nama depan dan belakang dan ingin mengamati dua nilai StateFlow secara bersamaan:
isFirstNameValid: StateFlow<Boolean>isLastNameValid: StateFlow<Boolean> Beginilah cara Anda melakukannya dengan menggunakan fungsi autoRun :
autoRun {
submitButton.isEnabled = get(isFirstNameValid) && get(isLastNameValid)
} Dengan get(isFirstNameValid) autoRun mengambil isFirstNameValid.value Kode itu mirip dengan menulis ini:
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)
}
}
} Prinsip yang sama dapat digunakan untuk membuat StateFlow reaktif derived :
val isFormValid : StateFlow < Boolean > = derived {
get(isFirstNameValid) && get(isLastNameValid)
} Sekarang Anda dapat menggunakan autoRun { submitButton.isEnabled = get(isFormValid) } di sisa kode Anda.
Lebih jauh, isFirstNameValid itu sendiri biasanya juga merupakan hasil dari perhitungan derived . Jadi, Anda dapat memiliki beberapa lapisan StateFlow derived reaktif.
Kerangka kerja UI reaktif seperti Jetpack menyusun secara otomatis membangun kembali UI setiap kali misalnya perubahan StateFlow . Jadi, di lapisan UI autoRun biasanya dapat diganti dengan Composable .
Namun, di bawah UI data Anda juga harus reaktif. Di sini reactiveState menyediakan derived untuk secara otomatis mengkomputasi kembali StateFlow berdasarkan StateFlow lainnya. Pola ini sangat berguna dalam praktiknya dan memberikan fondasi yang sempurna untuk kerangka kerja seperti Jetpack Compose yang terutama fokus pada aspek UI. ReactiveState yang derived dan autoRun memberikan reaktivitas yang sama untuk data dan logika bisnis Anda.
Di Jetpack menulis, Anda bahkan memiliki derivedStateOf yang sangat mirip dengan derived . Jadi, Anda dapat memilih apakah Anda ingin membangun logika bisnis Anda berdasarkan Perpustakaan Coroutines resmi ( StateFlow / derived ) atau Jetpack Compose ( State / derivedStateOf ). Namun, Perpustakaan Coroutines memiliki keuntungan yang tersedia untuk lebih banyak platform dan sepenuhnya independen dari kerangka kerja UI apa pun. Akhirnya, sebagian besar perpustakaan non-UI sumber terbuka mungkin akan didasarkan pada coroutine, sehingga kode berbasis StateFlow mungkin juga lebih baik untuk kompatibilitas/interoperabilitas.
Dengan kata lain, kombinasi kedua solusi yang digunakan bersama -sama menghasilkan basis kode multiplatform yang sepenuhnya reaktif - yang meningkatkan kesederhanaan kode dan menghindari banyak bug.
Selain itu, Jetpack Compose saat ini tidak memberikan dukungan ViewModel multiplatform atau arsitektur skala besar. Jadi, perpustakaan ini memecahkannya dengan memberikan BaseReactiveState untuk viewmodels. Ini juga dilengkapi dengan sistem acara sadar siklus hidup ( eventNotifier ) dan penanganan status pemuatan (sehingga Anda dapat melacak satu atau beberapa indikator pemuatan yang berbeda berdasarkan coroutine yang Anda luncurkan).
Perpustakaan ini didasarkan pada reactive_state untuk flutter dan diadaptasi dengan pola multiplatform dan android Kotlin.
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.