Middle
Como implementar diferentes estados numa aplicação Android usando classes seladas?
sobes.tech IA
Resposta da IA
As classes seladas são ideais para modelar um conjunto finito de estados. Cada estado secundário pode conter seus próprios dados exclusivos.
Exemplo:
sealed class UiState {
object Loading : UiState() // Estado de carregamento sem dados
data class Success(val data: List<Item>) : UiState() // Estado bem-sucedido com dados recebidos
data class Error(val message: String) : UiState() // Estado de erro com mensagem
object Idle : UiState() // Estado inicial ou neutro
}
Aplicação:
- No
ViewModel, pode-se atualizarMutableStateFlow(ou outro tipo observável) com oUiStateatual. - No
FragmentouActivity, inscrever-se nas mudanças deUiStatee usarwhenpara tratar cada estado possível, atualizando a UI de forma adequada.
// No 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() // Sua função para obter dados
_uiState.value = UiState.Success(result)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message ?: "Erro desconhecido")
}
}
}
}
// No Fragmento/Atividade (usando Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
when (uiState) {
UiState.Idle -> { /* Mostrar tela inicial */ }
UiState.Loading -> { /* Mostrar indicador de carregamento */ }
is UiState.Success -> {
val data = (uiState as UiState.Success).data
// Mostrar dados
}
is UiState.Error -> {
val errorMessage = (uiState as UiState.Error).message
// Mostrar mensagem de erro
}
}
}
Vantagens:
- Verificação exaustiva: O compilador exige tratar todas as subclasses da classe selada na expressão
when. Isso evita omissões e aumenta a confiabilidade do código. - Modelagem clara de estados: Define explicitamente todos os estados possíveis do componente UI.
- Segurança de tipos: Cada estado possui seus próprios dados, acessíveis de forma segura sem necessidade de casting.
- Melhor legibilidade: Código que usa classes seladas para estados torna-se mais compreensível e fácil de manter.
Este método é especialmente útil com Flow e Compose, mas também funciona bem com LiveData e View Binding.