Sobes.tech
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 atualizar MutableStateFlow (ou outro tipo observável) com o UiState atual.
  • No Fragment ou Activity, inscrever-se nas mudanças de UiState e usar when para 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.