Kotlin Academy · Aula

Modelando o estado da interface com classes seladas

Aplique classes seladas para representar os estados de interface Carregando, Sucesso e Erro.

Aula 3 de 413 etapas

Modelando o estado da interface com classes seladas é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.

O problema do estado da interface do usuário

As telas da interface do usuário têm vários estados: carregando, exibindo dados, exibindo um erro ou vazia. Gerenciar isso com booleanos (isLoading, hasError) é frágil. Classes seladas resolvem esse problema.

O clássico inferno dos booleanos

Usar booleanos separados leva a estados impossíveis.
// 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 selado: somente estados válidos

Uma classe selada torna os estados inválidos impossíveis de representar.
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>()

Renderização com base no estado

Use uma expressão condicional para renderizar a interface do usuário correta 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 emitindo estados

Um ViewModel emite estados selados por meio de 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")
        }
    }
}

Composição de estados com conteúdo interno

Use estados selados genéricos para lidar com qualquer tipo de dados.
fun <T> loading(): UiState<T> = Loading
fun <T> success(data: T): UiState<T> = Success(data)
fun <T> error(msg: String): UiState<T> = Error(msg)

Exemplo de estado de paginação

Classes seladas representam naturalmente os estados de listas paginadas.
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()

Transformação de estado

Mapeie estados bem-sucedidos sem alterar os outros 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
}

Testes com estados selados

Os estados são fáceis de testar — basta verificar qual variante foi emitida.
@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 versus vários fluxos

Um único fluxo de estado selado é mais claro do que vários fluxos separados que precisam permanecer 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)

Adição de metadados aos estados

Os subtipos selados podem carregar metadados relevantes.
data class Error(
    val message: String,
    val code: Int = 0,
    val retryable: Boolean = true,
    val timestamp: Long = System.currentTimeMillis()
) : UiState<Nothing>()

Verificação rápida

Que problema fundamental é resolvido ao modelar o estado da interface do usuário com classes seladas?

Recapitulação

Modele o estado da interface do usuário com classes seladas: Loading, Success(dados), Error(mensagem), Empty. Use uma expressão condicional para renderizar cada caso. Um StateFlow com um tipo selado é melhor do que vários sinalizadores booleanos. Próximo: aninhamento de hierarquias seladas!
Grátis para começar

Aprenda Kotlin com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
51
Aulas
203

Perguntas Frequentes

A aula “Modelando o estado da interface com classes seladas” é grátis?

Sim — o texto completo de “Modelando o estado da interface com classes seladas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.

O que vou aprender em “Modelando o estado da interface com classes seladas”?

Aplique classes seladas para representar os estados de interface Carregando, Sucesso e Erro. Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Kotlin Academy?

Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Modelando o estado da interface com classes seladas”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Kotlin Academy?

Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. sealed class vs sealed interface: quando usar cada uma
  2. when exaustivo com hierarquias seladas
  3. Modelando o estado da interface com classes seladas
  4. Aninhando e combinando hierarquias seladas
← Voltar para Kotlin Academy