Легкое реактивное управление состоянием и просмотр моделей для многоплатформы Kotlin. Нет шаблон. Совместим с Android.
Reactivestate-Kotlin предоставляет эти основы для создания многоплатформенных видов и логики более низкого уровня:
CoroutineDispatcher S вездеСмотрите документацию по реакции для более подробной информации.
Android, JVM, iOS, TVOS, Watchos, MacoSarm64, MacoSx64, Mingwx64, Linuxx64
Добавьте пакет в зависимости вашего build.gradle 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
} Кроме того, убедитесь, что вы интегрировали Maven Central Repo, например, в свой корень build.gradle :
subprojects {
repositories {
// ...
mavenCentral()
// ...
}
}Здесь представлены следующие два принципа, чтобы дать вам быстрое представление только о аспекте реактивного программирования. В разделе «Руководство» в документации описывается, как работать с более продвинутыми аспектами, такими как многоплатформенные виды, обработка жизненного цикла и т. Д.
Примечание. Хотя обсуждение касается StateFlow , вы также можете использовать LiveData или даже реализовать расширения для других наблюдаемых значений.
Представьте, что у вас есть входная форма с именем и фамилией, и вы хотите наблюдать два значения StateFlow одновременно:
isFirstNameValid: StateFlow<Boolean>isLastNameValid: StateFlow<Boolean> Вот как вы делаете это, используя функцию autoRun :
autoRun {
submitButton.isEnabled = get(isFirstNameValid) && get(isLastNameValid)
} С get(isFirstNameValid) вы получаете isFirstNameValid.value и в то же время сообщаете autoRun повторно предъявить блок всякий раз, когда значение изменяется. Этот код похож на написание этого:
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)
}
}
} Тот же принцип может быть использован для создания derived реактивного StateFlow :
val isFormValid : StateFlow < Boolean > = derived {
get(isFirstNameValid) && get(isLastNameValid)
} Теперь вы можете использовать autoRun { submitButton.isEnabled = get(isFormValid) } в остальной части вашего кода.
Еще дальше, сам isFirstNameValid обычно также является результатом derived вычисления. Таким образом, вы можете иметь несколько слоев реактивного derived StateFlow S.
Реактивные рамки пользовательского интерфейса, такие как JetPack, составляют автоматически восстанавливают пользовательский интерфейс всякий раз, когда изменяется StateFlow . Таким образом, в слое пользовательского интерфейса autoRun обычно можно заменить на Composable .
Тем не менее, ниже пользовательского интерфейса ваши данные также должны быть реактивными. Здесь Reactivestate derived , чтобы автоматически перекомплектовать StateFlow на основе других StateFlow S. Этот шаблон очень полезен на практике и обеспечивает идеальную основу для таких рамок, как JetPack Compose, которые в основном фокусируются на аспекте пользовательского интерфейса. derived и autoRun Reactivestate обеспечивают такую же реакционную способность для ваших данных и бизнес -логики.
В JetPack Compose у вас даже есть derivedStateOf что очень похоже на derived . Таким образом, вы можете выбрать, хотите ли вы создать свою бизнес -логику на основе официальной библиотеки Coroutines ( StateFlow / derived ) или JetPack Compose ( State / derivedStateOf ). Тем не менее, библиотека Coroutines имеет то преимущество, которое она доступна для большего количества платформ, и она полностью независимо от любых фреймворков пользовательского интерфейса. Наконец, большинство библиотек, не являющихся UI с открытым исходным кодом, вероятно, будут основаны на Coroutines, поэтому код на основе StateFlow также может быть лучше для совместимости/совместимости.
Другими словами, комбинация обоих решений, используемых вместе, приводит к полностью реактивной многоплатформенной кодовой базе, которая улучшает простоту кода и избегает многих ошибок.
Кроме того, JetPack Compose в настоящее время не предоставляет никакой многоплатформенной поддержки ViewModel или какой-либо крупномасштабной архитектуры. Таким образом, эта библиотека решает это, предоставляя BaseReactiveState для ViewModels. Он также поставляется с системой событий на жизненный цикл ( eventNotifier ) и обработкой состояния загрузки (так что вы можете отслеживать один или несколько различных индикаторов загрузки на основе кораток, которые вы запускаете).
Эта библиотека основана на Reactive_state для трепетала и адаптирована к мультиплатформенным и узорам 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.