0Pricing
Kotlin Academy · Lezione

Modellare lo stato dell'interfaccia con le sealed class

Applichi le sealed class per rappresentare gli stati dell'interfaccia Loading, Success ed Error.

Modellare lo stato dell'interfaccia con le sealed class è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.

Il problema dello stato dell'interfaccia utente

Le schermate dell'interfaccia utente possono trovarsi in diversi stati: caricamento, visualizzazione dei dati, visualizzazione di un errore o stato vuoto. Gestirli con valori booleani (isLoading, hasError) è fragile. Le sealed class risolvono questo problema.

Il classico inferno dei valori booleani

L'utilizzo di valori booleani separati porta a stati impossibili.
// 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!

Stato sealed: solo stati validi

Una sealed class rende impossibile rappresentare stati non validi.
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>()

Rendering in base allo stato

Utilizzi when per visualizzare l'interfaccia utente corretta per ogni stato.
fun render(state: UiState<List<Item>>) = when (state) {
    Loading -> showProgressBar()
    is Success -> showItems(state.data)
    is Error -> showError(state.message, state.retryable)
    Empty -> showEmptyView()
}

Emissione degli stati dal ViewModel

Un ViewModel emette stati sealed tramite 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")
        }
    }
}

Composizione degli stati con contenuto incorporato

Utilizzi stati sealed generici per gestire qualsiasi tipo di dati.
fun <T> loading(): UiState<T> = Loading
fun <T> success(data: T): UiState<T> = Success(data)
fun <T> error(msg: String): UiState<T> = Error(msg)

Esempio di stato della paginazione

Le sealed class rappresentano naturalmente gli stati degli elenchi paginati.
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()

Trasformazione dello stato

Mappi gli stati completati senza modificare gli altri casi.
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
}

Test con stati sealed

Gli stati sono facili da testare: è sufficiente verificare quale variante è stata emessa.
@Test
fun testLoadingState() {
    viewModel.loadItems()
    assertEquals(Loading, viewModel.state.value)
}
@Test
fun testSuccessState() {
    viewModel.setData(listOf(item))
    assert(viewModel.state.value is Success)
}

Stato combinato o più flussi

Un singolo flusso di stato sealed è più semplice di più flussi separati che devono rimanere sincronizzati.
// 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)

Aggiunta di metadati agli stati

I sottotipi sealed possono contenere metadati pertinenti.
data class Error(
    val message: String,
    val code: Int = 0,
    val retryable: Boolean = true,
    val timestamp: Long = System.currentTimeMillis()
) : UiState<Nothing>()

Verifica rapida

Quale problema fondamentale risolve la modellazione dello stato dell'interfaccia utente con le sealed class?

Riepilogo

Modelli lo stato dell'interfaccia utente con sealed class: Loading, Success(data), Error(message), Empty. Utilizzi when per visualizzare ogni caso. Un singolo StateFlow con un tipo sealed è preferibile a più flag booleani. Prossimo argomento: annidare le gerarchie sealed

Domande Frequenti

La lezione «Modellare lo stato dell'interfaccia con le sealed class» è gratuita?

Sì — il testo completo di «Modellare lo stato dell'interfaccia con le sealed class» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.

Cosa imparerò in «Modellare lo stato dell'interfaccia con le sealed class»?

Applichi le sealed class per rappresentare gli stati dell'interfaccia Loading, Success ed Error. Eserciti Kotlin Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Kotlin Academy?

Non è richiesta alcuna esperienza precedente. Kotlin Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Modellare lo stato dell'interfaccia con le sealed class»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Kotlin Academy?

Sì. Ogni lezione Kotlin Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. sealed class e sealed interface: quando usare ciascuna
  2. when esaustivo con gerarchie sealed
  3. Modellare lo stato dell'interfaccia con le sealed class
  4. Annidare e combinare gerarchie sealed
← Torna a Kotlin Academy