Flow para Kotlin: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a Flow: ¿qué es y para qué sirve?

\n\n

Flow es una biblioteca para trabajar con flujos de datos reactivos (reactive streams) en el lenguaje de programación Kotlin. Es parte del ecosistema de Kotlin Coroutines y proporciona una forma potente, segura en tipos y asíncrona de procesar secuencias de datos que se generan con el tiempo.

\n\n

A diferencia de las colecciones normales (List, Set), que almacenan todos los elementos en la memoria de una vez, Flow es un flujo frío (cold stream). Esto significa que los datos comienzan a generarse solo cuando aparece un suscriptor (collector). Flow es ideal para:

\n
    \n
  • Procesamiento asíncrono de datos: Obtener datos de la red, base de datos o sistema de archivos sin bloquear el hilo principal.
  • \n
  • Manejo de eventos: Clics, movimientos del ratón, actualizaciones de la interfaz de usuario.
  • \n
  • Programación reactiva: Crear cadenas de transformaciones de datos (map, filter, flatMap) con manejo automático de errores y cancelación.
  • \n
  • Integración con corrutinas: Flow es totalmente compatible con Kotlin Coroutines, lo que permite combinarlo fácilmente con otras operaciones asíncronas.
  • \n
\n\n

¿Por qué usar Flow en lugar de enfoques antiguos (por ejemplo, RxJava o callbacks)?

\n
    \n
  • Simplicidad y concisión: La API de Flow es minimalista e intuitiva para desarrolladores de Kotlin.
  • \n
  • Seguridad: Seguridad de tipos a nivel de compilador.
  • \n
  • Integración con corrutinas: Utiliza todas las ventajas de la concurrencia estructurada (structured concurrency).
  • \n
  • Rendimiento: Ligero y eficiente, no crea objetos innecesarios.
  • \n
\n\n

Instalación de Flow

\n\n

Flow es parte de la biblioteca kotlinx.coroutines. Para usarlo, debe agregar la dependencia a su archivo build.gradle.kts (para Gradle) o pom.xml (para Maven).

\n\n

Gradle (Kotlin DSL)

\n
dependencies {\n    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")\n    // Para usar Flow en Android (con soporte de Lifecycle)\n    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1")\n}
\n\n

Gradle (Groovy)

\n
dependencies {\n    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1'\n    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'\n}
\n\n

Maven

\n
\n    org.jetbrains.kotlinx\n    kotlinx-coroutines-core\n    1.8.1\n
\n\n

Importante: Asegúrese de que la versión de Kotlin y la versión de kotlinx-coroutines sean compatibles. La versión actual se puede encontrar en GitHub.

\n\n

Inicio rápido: primer Flow

\n\n

Vamos a crear un Flow simple que emita tres números con un retraso, y nos suscribamos a él.

\n\n
import kotlinx.coroutines.*\nimport kotlinx.coroutines.flow.*\n\nfun simpleFlow(): Flow<Int> = flow {\n    println("Flow iniciado")\n    for (i in 1..3) {\n        delay(100) // Simula trabajo asíncrono\n        emit(i)    // Emite el valor\n    }\n}\n\nfun main() = runBlocking {\n    println("Hilo principal: ${Thread.currentThread().name}")\n\n    // Nos suscribimos al Flow (recolectamos los datos)\n    simpleFlow().collect { value ->\n        println("Recibido: $value")\n    }\n\n    println("Flow finalizado")\n}
\n\n

Salida:

\n
Hilo principal: main\nFlow iniciado\nRecibido: 1\nRecibido: 2\nRecibido: 3\nFlow finalizado
\n\n

Explicación

Recommendations