0Pricing
Kotlin Academy · Lección

Modelar el estado de la interfaz con clases selladas

Aplique clases selladas para representar los estados de la interfaz Loading, Success y Error.

Modelar el estado de la interfaz con clases selladas es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.

El problema del estado de la interfaz de usuario

Las pantallas de la interfaz de usuario tienen varios estados: cargando, mostrando datos, mostrando un error o vacía. Gestionarlos con booleanos (isLoading, hasError) es frágil. Las sealed classes resuelven este problema.

El clásico caos de los booleanos

Utilizar booleanos separados conduce a estados imposibles.
// Fragile: isLoading=true AND hasError=true is invalid
var isLoading = false
var hasError = false
var data: List<Item>? = null
// 8 combinations, most of which are invalid!

Estado sealed: solo estados válidos

Una sealed class hace que los estados no válidos no puedan representarse.
sealed class UiState<out T>
object Loading : UiState<Nothing>()
data class Success<T>(val data: T) : UiState<T>()
data class Error(val message: String, val retryable: Boolean = true) : UiState<Nothing>()
object Empty : UiState<Nothing>()

Renderizar según el estado

Utilice when para renderizar la interfaz de usuario correcta para cada estado.
fun render(state: UiState<List<Item>>) = when (state) {
    Loading -> showProgressBar()
    is Success -> showItems(state.data)
    is Error -> showError(state.message, state.retryable)
    Empty -> showEmptyView()
}

ViewModel emitiendo estados

Un ViewModel emite estados sealed mediante StateFlow.
class ItemViewModel : ViewModel() {
    private val _state = MutableStateFlow<UiState<List<Item>>>(Loading)
    val state: StateFlow<UiState<List<Item>>> = _state

    fun loadItems() = viewModelScope.launch {
        _state.value = Loading
        _state.value = try {
            Success(repository.getItems())
        } catch (e: Exception) {
            Error(e.message ?: "Unknown error")
        }
    }
}

Componer estados con contenido incluido

Utilice estados sealed genéricos para gestionar cualquier tipo de datos.
fun <T> loading(): UiState<T> = Loading
fun <T> success(data: T): UiState<T> = Success(data)
fun <T> error(msg: String): UiState<T> = Error(msg)

Ejemplo de estado de paginación

Las sealed classes permiten modelar de forma natural los estados de una lista paginada.
sealed class PageState
object Idle : PageState()
object FirstLoad : PageState()
data class Content(val items: List<Item>, val hasMore: Boolean) : PageState()
data class LoadingMore(val items: List<Item>) : PageState()
data class Error(val items: List<Item>?, val msg: String) : PageState()

Transformar el estado

Mapee los estados correctos sin modificar los demás casos.
fun <T, R> UiState<T>.mapData(transform: (T) -> R): UiState<R> = when (this) {
    is Success -> Success(transform(data))
    is Error -> this
    Loading -> Loading
    Empty -> Empty
}

Probar con estados sealed

Los estados son fáciles de probar: basta con comprobar qué variante se emitió.
@Test
fun testLoadingState() {
    viewModel.loadItems()
    assertEquals(Loading, viewModel.state.value)
}
@Test
fun testSuccessState() {
    viewModel.setData(listOf(item))
    assert(viewModel.state.value is Success)
}

Estado combinado frente a varios flujos

Un único flujo de estado sealed es más limpio que varios flujos independientes que deben mantenerse sincronizados.
// Fragile: two flows must stay in sync
val loading = MutableStateFlow(false)
val error = MutableStateFlow<String?>(null)

// Clean: one sealed state
val state = MutableStateFlow<UiState<List<Item>>>(Loading)

Añadir metadatos a los estados

Los subtipos sealed pueden incluir metadatos relevantes.
data class Error(
    val message: String,
    val code: Int = 0,
    val retryable: Boolean = true,
    val timestamp: Long = System.currentTimeMillis()
) : UiState<Nothing>()

Comprobación rápida

¿Qué problema clave resuelve modelar el estado de la interfaz de usuario con sealed classes?

Resumen

Modele el estado de la interfaz de usuario con sealed classes: Loading, Success(data), Error(message), Empty. Utilice when para renderizar cada caso. Un StateFlow con un tipo sealed es mejor que varios indicadores booleanos. A continuación: ¡anidamiento de jerarquías sealed!

Preguntas frecuentes

¿La lección «Modelar el estado de la interfaz con clases selladas» es gratis?

Sí — el texto completo de «Modelar el estado de la interfaz con clases selladas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Modelar el estado de la interfaz con clases selladas»?

Aplique clases selladas para representar los estados de la interfaz Loading, Success y Error. Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Kotlin Academy?

No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Modelar el estado de la interfaz con clases selladas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?

Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. sealed class frente a sealed interface: cuándo usar cada una
  2. when exhaustivo con jerarquías selladas
  3. Modelar el estado de la interfaz con clases selladas
  4. Anidar y combinar jerarquías selladas
← Volver a Kotlin Academy