Sobes.tech
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övcud UiState ilə MutableStateFlow (və ya başqa müşahidə olunan növ) yenilənə bilər.
  • Fragment və ya Activitydə, UiState dəyişikliklərinə abunə olun və hər mümkün vəziyyəti when ilə 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 when iç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.