Middle
Android tətbiqində müxtəlif vəziyyətləri sealed siniflərdən istifadə edərək necə həyata keçirmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
Yapışdırılmış siniflər son vəziyyət dəstini modelləşdirmək üçün idealdır. Hər bir alt vəziyyət öz unikal məlumatlarını içərə bilər.
Nümunə:
sealed class UiState {
object Loading : UiState() // Məlumat olmadan yükləmə vəziyyəti
data class Success(val data: List<Item>) : UiState() // Qəbul edilən məlumatlarla uğurlu vəziyyət
data class Error(val message: String) : UiState() // Mesaj ilə xəta vəziyyəti
object Idle : UiState() // Başlanğıc və ya neytral vəziyyət
}
Tətbiq:
ViewModeldə, mövcudUiStateiləMutableStateFlow(və ya başqa müşahidə olunan növ) yenilənə bilər.Fragmentvə yaActivitydə,UiStatedəyişikliklərinə abunə olun və hər mümkün vəziyyətiwhenilə idarə edin, UI-ni uyğun şəkildə yeniləyin.
// ViewModel-də
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() // Məlumat alma funksiyanız
_uiState.value = UiState.Success(result)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message ?: "Naməlum xəta")
}
}
}
}
// Compose istifadə edən Fragment/Activity-də
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
when (uiState) {
UiState.Idle -> { /* Başlanğıc ekranını göstər */ }
UiState.Loading -> { /* Yükləmə göstəricisini göstər */ }
is UiState.Success -> {
val data = (uiState as UiState.Success).data
// Məlumatları göstər
}
is UiState.Error -> {
val errorMessage = (uiState as UiState.Error).message
// Xəta mesajını göstər
}
}
}
Üstünlüklər:
- Tam yoxlama: Kompilyator
wheniçində bütün alt sinifləri idarə etməyi tələb edir. Bu, vəziyyətlərin qaçırılmasını qarşısını alır və kodun etibarlılığını artırır. - Aydın vəziyyət modelləşdirməsi: UI komponentinin bütün mümkün vəziyyətlərini açıq şəkildə müəyyən edir.
- Tip təhlükəsizliyi: Hər vəziyyətin öz məlumatları var və onlara təhlükəsiz giriş mümkündür, cast etməyə ehtiyac olmadan.
- Daha yaxşı oxunaqlıq: Vəziyyətlər üçün siniflər istifadə edən kod daha aydın və asan dəstəklənir.
Bu yanaşma xüsusilə Flow və Compose ilə istifadə üçün faydalıdır, lakin LiveData və View Binding ilə də yaxşı işləyir.