Middle
¿Cómo se pueden implementar diferentes estados en una aplicación de Android usando clases selladas?
sobes.tech AI
Respuesta de la IA
Las clases selladas son ideales para modelar un conjunto finito de estados. Cada estado secundario puede contener sus propios datos únicos.
Ejemplo:
sealed class UiState {
object Loading : UiState() // Estado de carga sin datos
data class Success(val data: List<Item>) : UiState() // Estado exitoso con datos recibidos
data class Error(val message: String) : UiState() // Estado de error con mensaje
object Idle : UiState() // Estado inicial o neutral
}
Aplicación:
- En
ViewModelse puede actualizarMutableStateFlow(u otro tipo observable) con elUiStateactual. - En
FragmentoActivity, suscribirse a los cambios enUiStatey usarwhenpara manejar cada estado posible, actualizando la UI en consecuencia.
// En ViewModel
class MyViewModel : ViewModel() {
private val _uiState = MutableStateFlow<UiState>(UiState.Idle)
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
fun loadData() {
viewModelScope.launch {
_uiState.value = UiState.Loading
try {
val result = fetchData() // Tu función para obtener datos
_uiState.value = UiState.Success(result)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message ?: "Error desconocido")
}
}
}
}
// En Fragmento/Actividad (usando Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
when (uiState) {
UiState.Idle -> { /* Mostrar pantalla inicial */ }
UiState.Loading -> { /* Mostrar indicador de carga */ }
is UiState.Success -> {
val data = (uiState as UiState.Success).data
// Mostrar datos de data
}
is UiState.Error -> {
val errorMessage = (uiState as UiState.Error).message
// Mostrar mensaje de error
}
}
}
Ventajas:
- Verificación exhaustiva: El compilador requiere manejar todas las subclases de la clase sellada en la expresión
when. Esto previene omisiones y aumenta la fiabilidad del código. - Modelado claro de estados: Define explícitamente todos los estados posibles del componente UI.
- Seguridad de tipos: Cada estado tiene sus propios datos, accesibles de forma segura sin necesidad de casting.
- Mejor legibilidad: El código que usa clases selladas para estados es más comprensible y fácil de mantener.
Este enfoque es especialmente útil con Flow y Compose, pero también funciona bien con LiveData y View Binding.