Tengo algunas preguntas sobre Kotlin Flow
- Puedo observar LiveData desde múltiples Fragmentos. ¿Puedo hacer esto con Flow? Si es así, ¿entonces cómo?
- Podemos tener múltiples LiveData desde un solo LiveData usando
map
&switchMap
. ¿Hay alguna manera de tener múltiples flujos de una sola fuente de flujo? - Utilizando
MutableLiveData
puedo actualizar datos desde cualquier lugar utilizando la referencia de variable. ¿Hay alguna manera de hacer lo mismo con Flow?
Tengo un caso de uso como: Observaré un SharedPreferences
uso callbackFlow{...}
que me dará un flujo de fuente única. A partir de ese flujo, quiero crear múltiples flujos para cada par clave-valor.
Estas pueden sonar preguntas tontas. Soy nuevo en el mundo de Rx y Flow.
Respuestas:
Si. Puedes hacer esto con
emit
ycollect
. Thinkemit
es similar a los datos en vivopostValue
ycollect
es similar aobserve
. Vamos a dar un ejemplo.Repositorio
ViewModel
Fragmento
El flujo es muy útil. Simplemente puede crear flujo dentro del flujo. Digamos que desea agregar un signo de grado a cada uno de los datos de pronóstico del tiempo.
ViewModel
Luego, recopile los datos en Fragmento igual que # 1. Aquí lo que sucede es que el modelo de vista está recopilando datos del repositorio y el fragmento está recopilando datos del modelo de vista.
No puede emitir valor fuera del flujo. El bloque de código dentro del flujo solo se ejecuta cuando hay algún recopilador. Pero puede convertir el flujo en datos en vivo utilizando la extensión asLiveData de LiveData.
ViewModel
En tu caso puedes hacer esto
Editar
Gracias a @mark por su comentario. Crear un nuevo flujo en el modelo de vista para la
getWeatherForecast
función es realmente innecesario. Podría reescribirse comofuente
val sharedPref = getSharedPref()
y puedes usar recoger en varios lugaressharedPref.collect {}
. Lo único es que recoger es suspender, debe llamarlo desde el bloque de rutina. Y feliz de ayudar np :)Hay una nueva
Flow.asLiveData()
función de extensión en los nuevosandroidx.lifecycle
paquetes ktx. Puede obtener más información en mi artículo: https://www.netguru.com/codestories/android-coroutines-%EF%B8%8Fin-2020fuente
En una arquitectura de 3 niveles: presentación de dominio de datos, Flow debe tener lugar en la capa de datos (bases de datos, red, caché ...) y luego, como Samuel Urbanowicz mencionó, puede asignar Flow a LiveData.
En general, Flow es casi lo que el Observable (o Flowable) es para RxJava. No lo confundas con LiveData.
más aquí: https://medium.com/@elizarov/cold-flows-hot-channels-d74769805f9
fuente