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:
ViewModeliçinde, mevcutUiStateileMutableStateFlow(veya başka bir gözlemlenebilir tür) güncellenebilir.FragmentveyaActivityiçinde,UiStatedeğişikliklerine abone olunabilir ve her olası durumu uygun şekilde işlemek içinwhenkullanı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,
whenifadesinde 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.