Sobes.tech
Middle

Android uygulamasında farklı durumları sealed sınıflar kullanarak nasıl implemente edebilirsiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Sızdırılmış sınıflar, son bir durum kümesini modellemek için idealdir. Her alt durumu, kendi benzersiz verilerini içerebilir.

Örnek:

sealed class UiState {
    object Loading : UiState() // Veri olmadan yükleniyor durumu
    data class Success(val data: List<Item>) : UiState() // Alınan verilerle başarılı durum
    data class Error(val message: String) : UiState() // Mesaj ile hata durumu

    object Idle : UiState() // Başlangıç veya nötr durum
}

Uygulama:

  • ViewModel içinde, mevcut UiState ile MutableStateFlow (veya başka bir gözlemlenebilir tür) güncellenebilir.
  • Fragment veya Activity içinde, UiState değişikliklerine abone olunabilir ve her olası durumu uygun şekilde işlemek için when kullanılabilir, böylece UI güncellenir.
// ViewModel'da
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() // Veri alma fonksiyonunuz
                _uiState.value = UiState.Success(result)
            } catch (e: Exception) {
                _uiState.value = UiState.Error(e.message ?: "Bilinmeyen hata")
            }
        }
    }
}
// Compose kullanarak Fragment/Activity'de
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    val uiState by viewModel.uiState.collectAsState()

    when (uiState) {
        UiState.Idle -> { /* Başlangıç ekranını göster */ }
        UiState.Loading -> { /* Yükleniyor göstergesi */ }
        is UiState.Success -> {
            val data = (uiState as UiState.Success).data
            // Verileri göster
        }
        is UiState.Error -> {
            val errorMessage = (uiState as UiState.Error).message
            // Hata mesajını göster
        }
    }
}

Avantajlar:

  • Kapsamlı kontrol: Derleyici, when ifadesinde tüm alt sınıfların işlenmesini gerektirir. Bu, durumların atlanmasını önler ve kodun güvenilirliğini artırır.
  • Açık durum modellemesi: UI bileşeninin tüm olası durumlarını açıkça tanımlar.
  • Tip güvenliği: Her durumun kendi verileri vardır ve bunlara güvenli erişim sağlanır, tip dönüşümüne gerek kalmaz.
  • Daha iyi okunabilirlik: Durumlar için sınıflar kullanan kod daha anlaşılır ve bakımı kolay hale gelir.

Bu yaklaşım özellikle Flow ve Compose ile kullanışlıdır, ancak LiveData ve View Binding ile de iyi çalışır.