Sobes.tech
Middle

Чӣ гуна бо истифода аз синфҳои sealed ҳолатҳои гуногунро дар барномаи Android амалӣ кардан мумкин аст?

sobes.tech AI

Ҷавоб аз AI

Класиҳои пӯшида барои моделсозии маҷмӯи охирини ҳолатҳо комил мебошанд. Ҳар як ҳолати зеркласс метавонад маълумоти худро дошта бошад.

Масалан:

sealed class UiState {
    object Loading : UiState() // Ҳолати боргирӣ бе маълумот
    data class Success(val data: List<Item>) : UiState() // Ҳолати муваффақ бо маълумотҳои гирифташуда
    data class Error(val message: String) : UiState() // Ҳолати хатогӣ бо паём

    object Idle : UiState() // Ҳолати ибтидоӣ ё нейтрал
}

Истифода:

  • Дар ViewModel метавонед MutableStateFlow (ё дигар навъи назоратшаванда) бо UiState-и ҳозира навсозӣ кунед.
  • Дар Fragment ё Activity ба тағйиротҳои UiState обуна шавед ва бо ёрии when ҳар ҳолати имконпазирро баррасӣ кунед, ки UI-ро мувофиқи он навсозӣ мекунад.
// Дар ViewModel
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() // Функсияи шумо барои гирифтани маълумот
                _uiState.value = UiState.Success(result)
            } catch (e: Exception) {
                _uiState.value = UiState.Error(e.message ?: "Хатои номуайян")
            }
        }
    }
}
// Дар Fragment/Activity (бо истифода аз Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    val uiState by viewModel.uiState.collectAsState()

    when (uiState) {
        UiState.Idle -> { /* Намоиши экрани ибтидоӣ */ }
        UiState.Loading -> { /* Намоиши нишондиҳандаи боргирӣ */ }
        is UiState.Success -> {
            val data = (uiState as UiState.Success).data
            // Намоиши маълумот
        }
        is UiState.Error -> {
            val errorMessage = (uiState as UiState.Error).message
            // Намоиши паёми хатогӣ
        }
    }
}

Манфиатҳо:

  • Тамоми назорат: Барномасозӣ талаб мекунад, ки ҳамаи зерклассҳои класи пӯшида дар изрази when баррасӣ шаванд. Ин пешгирӣ мекунад, ки ҳолатҳо фаромӯш шаванд ва боварнокиро баланд мебардорад.
  • Моделсозии равандҳои равшан: Ҳама ҳолатҳои имконпазири компонентҳои UI-ро равшан муайян мекунад.
  • Бехатарии навъ: Ҳар як ҳолат маълумоти худро дорад, ки ба он дастрасӣ бехатар аст, бе ниёз ба тағир додан.
  • Дидани беҳтар: Код, ки класи пӯшида барои ҳолатҳоро истифода мебарад, бештар фаҳмо ва осонтар нигоҳдории мешавад.

Ин усул махсусан бо Flow ва Compose муфид аст, аммо инчунин бо LiveData ва View Binding хуб кор мекунад.