Domina la conversión de flujos fríos a calientes con stateIn y sharedIn en Kotlin

📅 21/07/2026

En el desarrollo moderno de aplicaciones Android con Kotlin, el manejo eficiente de flujos de datos asíncronos es fundamental. La biblioteca de Flow de Kotlin ofrece dos categorías principales: Cold Flows y Hot Flows. Mientras que los primeros se crean bajo demanda y comienzan a emitir datos solo cuando un colector se suscribe, los segundos permanecen activos independientemente de los suscriptores. Para migrar de un comportamiento frío a uno caliente, Kotlin nos brinda dos operadores clave: stateIn y sharedIn. Este artículo te guiará a través de su uso, ventajas y buenas prácticas para optimizar tu app.

¿Qué son los Cold Flows y por qué convertirlos?

Un Cold Flow (flujo frío) es perezoso: no ejecuta su lógica de producción hasta que alguien lo recolecta. Cada suscriptor recibe una secuencia independiente de valores. Esto es útil para operaciones costosas que no deben replicarse, pero puede generar problemas cuando múltiples consumidores necesitan compartir el mismo estado o cuando se quiere evitar reinicializar cálculos cada vez que un nuevo observador se conecta.

Por el contrario, un Hot Flow (flujo caliente) emite datos de forma continua, sin importar si hay suscriptores. Ejemplos comunes son StateFlow y SharedFlow. Convertir un Cold Flow en un Hot Flow permite:

“Un Hot Flow no tiene que esperar a que un colectore se suscriba; puede estar emitiendo valores desde el inicio, y los nuevos suscriptores reciben solo los valores emitidos después de su llegada (o el último valor si es un StateFlow).”

stateIn: cuando necesitas un valor actualizable

El operador stateIn convierte un Cold Flow en un StateFlow. Un StateFlow siempre tiene un valor actual (el último emitido) y es ideal para representar estado de la interfaz. Al usar stateIn, debes especificar:

Ejemplo práctico:

val coldFlow: Flow = flow { 

emit(1); delay(1000); emit(2)

}

val hotStateFlow: StateFlow = coldFlow

.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), initialValue = 0)

Este patrón es muy habitual en ViewModels de Android, donde se expone un StateFlow que los fragmentos o actividades observan. La ventaja es que el flujo frío (por ejemplo, de una base de datos Room) se recolecta una sola vez y todos los observadores comparten el mismo estado.

sharedIn: cuando necesitas replicar eventos sin estado fijo

El operador sharedIn convierte un Cold Flow en un SharedFlow. A diferencia de StateFlow, un SharedFlow no guarda un valor actual; simplemente retransmite los valores emitidos a todos los suscriptores activos. Es perfecto para eventos "dispara y olvida", como notificaciones, toasts o navegaciones.

Al igual que stateIn, acepta un CoroutineScope y una configuración de sharingStarted. Además, puedes configurar:

Ejemplo:

val coldEventFlow: Flow = flow { 

emit("Evento 1"); delay(500); emit("Evento 2")

}

val hotSharedFlow: SharedFlow = coldEventFlow

.sharedIn(viewModelScope, SharingStarted.WhileSubscribed(), replay = 1)

Diferencias clave entre stateIn y sharedIn

Para elegir correctamente, considera estas diferencias:

Domina la conversión de flujos fríos a calientes con stateIn y sharedIn en Kotlin

Contenido original en https://www.msn.com/es-es/noticias/tecnologia/c%C3%B3mo-transformar-flujos-fr%C3%ADos-en-flujos-calientes-usando-statein-y-sharedin/ar-AA2872V4

Derechos de autor
Si cree que algún contenido infringe derechos de autor o propiedad intelectual, contacte en [email protected].


Copyright notice
If you believe any content infringes copyright or intellectual property rights, please contact [email protected].