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 хуб кор мекунад.