Kotlin Academy · Pelajaran

Memodelkan Status UI dengan Sealed Class

Terapkan sealed class untuk merepresentasikan status UI Loading, Success, dan Error.

Pelajaran 3 dari 413 langkah

Memodelkan Status UI dengan Sealed Class adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.

Masalah Status Antarmuka Pengguna

Layar antarmuka pengguna memiliki beberapa status: sedang dimuat, menampilkan data, menampilkan kesalahan, atau kosong. Mengelola semua ini dengan nilai boolean (isLoading, hasError) rapuh. Kelas tersegel mengatasinya.

Kekacauan Boolean Klasik

Menggunakan nilai boolean terpisah dapat menghasilkan status yang mustahil.
// 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!

Status Tersegel: Hanya Status yang Valid

Kelas tersegel membuat status yang tidak valid tidak dapat direpresentasikan.
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>()

Merender Berdasarkan Status

Gunakan percabangan untuk merender antarmuka pengguna yang tepat bagi setiap status.
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 Menghasilkan Status

ViewModel menghasilkan status tersegel melalui 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")
        }
    }
}

Menyusun Status dengan Konten di Dalamnya

Gunakan status tersegel generik untuk menangani tipe data apa pun.
fun <T> loading(): UiState<T> = Loading
fun <T> success(data: T): UiState<T> = Success(data)
fun <T> error(msg: String): UiState<T> = Error(msg)

Contoh Status dengan Paginasi

Kelas tersegel secara alami memodelkan status daftar berpaginasi.
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()

Mengubah Status

Petakan status yang berhasil tanpa menyentuh kasus lainnya.
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
}

Pengujian dengan Status Tersegel

Status mudah diuji—cukup periksa varian mana yang dihasilkan.
@Test
fun testLoadingState() {
    viewModel.loadItems()
    assertEquals(Loading, viewModel.state.value)
}
@Test
fun testSuccessState() {
    viewModel.setData(listOf(item))
    assert(viewModel.state.value is Success)
}

Status Gabungan dibandingkan Beberapa Aliran

Satu aliran status tersegel lebih rapi daripada beberapa aliran terpisah yang harus tetap sinkron.
// 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)

Menambahkan Metadata ke Status

Subtipe tersegel dapat membawa metadata yang relevan.
data class Error(
    val message: String,
    val code: Int = 0,
    val retryable: Boolean = true,
    val timestamp: Long = System.currentTimeMillis()
) : UiState<Nothing>()

Pemeriksaan Singkat

Masalah utama apa yang diselesaikan dengan memodelkan status antarmuka pengguna menggunakan kelas tersegel?

Ringkasan

Modelkan status antarmuka pengguna dengan kelas tersegel: Loading, Success(data), Error(message), Empty. Gunakan percabangan untuk merender setiap kasus. Satu StateFlow dengan tipe tersegel lebih baik daripada beberapa penanda boolean. Berikutnya: membuat hierarki tersegel bertingkat!
Gratis untuk memulai

Belajar Kotlin dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
51
Pelajaran
203

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memodelkan Status UI dengan Sealed Class” gratis?

Ya — teks lengkap “Memodelkan Status UI dengan Sealed Class” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Memodelkan Status UI dengan Sealed Class”?

Terapkan sealed class untuk merepresentasikan status UI Loading, Success, dan Error. Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Kotlin Academy?

Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Memodelkan Status UI dengan Sealed Class” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. sealed class vs sealed interface: Kapan Menggunakan Masing-Masing
  2. when Lengkap dengan Hierarki Sealed
  3. Memodelkan Status UI dengan Sealed Class
  4. Menumpuk dan Menggabungkan Hierarki Sealed
← Kembali ke Kotlin Academy