PMDM 0489 · B3 · T4 ROOM · Flow frío y Flow caliente

Simulador de flujos fríos y calientes

Cada vista ejecuta las mismas acciones sobre varios flujos a la vez para que compares cuántas consultas lanza Room, qué recibe cada colector y cuándo se para la suscripción.

La misma consulta de Room, observarTodos(), recolectada directamente (izquierda) y convertida en StateFlow con stateIn en el ViewModel (derecha). Añade colectores y modifica la tabla.

tabla libros · versión 1
Todavía no hay colectores. Crear el Flow no ejecuta ninguna consulta: los dos contadores están a 0.
Flow frío

La UI recolecta el Flow del DAO

0SELECT ejecutados
0observadores sobre la tabla
—valor actual (value)
@Query("SELECT * FROM libros ORDER BY year DESC")
fun observarTodos(): Flow<List<Libro>>

// Cada colector de la UI:
repository.observarLibros().collect { libros -> … }
Flow caliente

La UI recolecta el StateFlow del ViewModel

0SELECT ejecutados
0observadores sobre la tabla
Cargandovalor actual (value)
uiState: StateFlow<LibrosUiState>
upstream: parado
val uiState: StateFlow<LibrosUiState> =
    repository.observarLibros()
        .map<List<Libro>, LibrosUiState> { LibrosUiState.Exito(it) }
        .stateIn(
            scope = viewModelScope,
            started = SharingStarted.WhileSubscribed(5_000),
            initialValue = LibrosUiState.Cargando
        )

El mismo stateIn con las tres estrategias de SharingStarted del Anexo B2-A1. La pantalla recolecta con collectAsStateWithLifecycle(): deja de recolectar en segundo plano y desaparece un instante al girar el dispositivo. El reloj avanza en tiempo real.

t = 0,0 s · pantalla: sin ViewModel
Pulsa «Crear el ViewModel». Fíjate en qué carril se ejecuta la consulta en ese mismo momento.
upstream activo (observando Room)periodo de gracia de 5 sSELECT ejecutadoventana: últimos 40 s

Un Snackbar «añadido a favoritos» enviado de tres formas. La pantalla lo recoge con LaunchedEffect(Unit) { viewModel.eventos.collect { … } }, como en T2 §6: al girar el dispositivo, la composición se destruye y se vuelve a crear, y el colector desaparece durante un instante.

pantalla: visible · 1 colector
Pulsa ♥ y después gira el dispositivo. Observa en qué carril el Snackbar vuelve a aparecer sin que el usuario haya hecho nada.