Gestión de estado reactiva fácil y modelos de vista para Kotlin Multiplatforma. No hay placa. Compatible con Android.
Reactivestate-kotlin proporciona estas bases para construir modelos de vista multiplataforma y lógica de nivel inferior:
CoroutineDispatcher en todas partesConsulte la documentación Reactivestate para obtener más detalles.
Android, JVM, iOS, Tvos, WatchOS, MacOSarm64, MacOSX64, Mingwx64, LinuxX64
Agregue el paquete a su 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
} Además, asegúrese de haber integrado el repositorio central de Maven, por ejemplo, en su build.gradle de raíz.
subprojects {
repositories {
// ...
mavenCentral()
// ...
}
}Los siguientes dos principios están aquí para darle una idea rápida del aspecto de programación reactiva solamente. La sección "Guía" en la documentación describe cómo trabajar con los aspectos más avanzados como modelos de vista multiplataforma, manejo del ciclo de vida, etc.
Nota: Si bien la discusión es sobre StateFlow , también puede usar LiveData o incluso implementar extensiones para otros valores observables.
Imagine que tiene un formulario de entrada con el primer y apellido y desea observar dos valores StateFlow al mismo tiempo:
isFirstNameValid: StateFlow<Boolean>isLastNameValid: StateFlow<Boolean> Así es como lo haría utilizando la función autoRun :
autoRun {
submitButton.isEnabled = get(isFirstNameValid) && get(isLastNameValid)
} Con get(isFirstNameValid) Recupere isFirstNameValid.value y al mismo tiempo dígale a autoRun que vuelva a ejecutar el bloque cada vez que se cambia el valor. Ese código es similar a escribir esto:
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)
}
}
} El mismo principio se puede utilizar para crear un StateFlow reactivo derived :
val isFormValid : StateFlow < Boolean > = derived {
get(isFirstNameValid) && get(isLastNameValid)
} Ahora puede usar autoRun { submitButton.isEnabled = get(isFormValid) } en el resto de su código.
Al ir aún más allá, el propio isFirstNameValid generalmente también sería el resultado de un cálculo derived . Por lo tanto, puede tener múltiples capas de StateFlow derived reactivo.
Los marcos de interfaz de usuario reactivos como JetPack componen automáticamente la interfaz de usuario cada vez que cambia un StateFlow . Por lo tanto, en la capa de interfaz de usuario, autoRun generalmente se puede reemplazar con un Composable .
Sin embargo, debajo de la interfaz de usuario, sus datos aún deben ser reactivos también. Aquí Reactivestate proporciona derived para recomputar automáticamente un StateFlow basado en otros StateFlow s. Este patrón es muy útil en la práctica y proporciona la base perfecta para marcos como JetPack Compose que se centran principalmente en el aspecto de la UI. ReactiveState's derived and autoRun proporciona la misma reactividad para sus datos y lógica comercial.
En Jetpack componen que incluso se ha derivedStateOf que es muy similar a derived . Por lo tanto, puede elegir si desea construir su lógica comercial en función de la biblioteca oficial de Coroutinas ( StateFlow / derived ) o JetPack Compose ( State / derivedStateOf ). Sin embargo, la Biblioteca Coroutina tiene la ventaja de que está disponible para más plataformas y es totalmente independiente de los marcos de UI. Finalmente, la mayoría de las bibliotecas no UI de código abierto probablemente se basarán en las coroutinas, por lo que el código basado en StateFlow también podría ser mejor para la compatibilidad/interoperabilidad.
En otras palabras, la combinación de ambas soluciones utilizadas juntas da como resultado una base de código multiplataforma totalmente reactiva, que mejora la simplicidad del código y evita muchos errores.
Además, JetPack Compose actualmente no proporciona ningún soporte de modelador ViewModel o ninguna arquitectura a gran escala. Por lo tanto, esta biblioteca resuelve eso al proporcionar BaseReactiveState para ViewModels. También viene con un sistema de eventos con ciclo de vida ( eventNotifier ) y el manejo del estado de carga (para que pueda rastrear uno o múltiples indicadores de carga diferentes basados en las corutinas que lanza).
Esta biblioteca se basa en Reactive_State para Flutter y adaptada a los patrones de Kotlin Multiplatform y Android.
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.