ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်
Network-based app တစ်ခုမှာ loading state (data fetch နေဆဲ), success state (data ရပြီး), error state (network fail) — state သုံးမျိုးကို UI မှာ handle လုပ်ပေးရပါတယ် — user ကို 'ဘာဖြစ်နေလဲ' အမြဲ သိစေရမှာပါ (blank screen တစ်ခုတည်း ချန်ထားလို့ မရပါ)။ `sealed class UiState { object Loading; data class Success(val data: WeatherResponse); data class Error(val message: String) }` ဆိုတဲ့ pattern ကို state management အတွက် သုံးလေ့ရှိပါတယ်.
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
City name TextField ထဲ ရိုက်ပြီး Search button ကို click ရင် — ViewModel က `uiState = UiState.Loading` လို့ ပြောင်းပြီး, `weatherApi.getWeather(city)` ကို coroutine ထဲ ခေါ်ပါတယ် — success ဖြစ်ရင် `UiState.Success(response)`, fail ဖြစ်ရင် (network down, city not found) `UiState.Error("...")` ဆိုပြီး state ပြောင်းပါတယ်, UI ကတော့ `when (uiState) { is Loading -> CircularProgressIndicator(); is Success -> WeatherCard(...); is Error -> ErrorMessage(...) }` ဆိုပြီး state အလိုက် ကွဲပြားစွာ render လုပ်ပါတယ်.
အတူတူ ကြည့်မယ်
sealed class WeatherUiState {
object Loading : WeatherUiState()
data class Success(val data: WeatherResponse) : WeatherUiState()
data class Error(val message: String) : WeatherUiState()
}
class WeatherViewModel @Inject constructor(
private val api: WeatherApi
) : ViewModel() {
var uiState by mutableStateOf<WeatherUiState>(WeatherUiState.Loading)
private set
fun search(city: String) {
uiState = WeatherUiState.Loading
viewModelScope.launch {
uiState = try {
WeatherUiState.Success(api.getWeather(city))
} catch (e: Exception) {
WeatherUiState.Error("Could not load weather for $city")
}
}
}
}City name ရိုက်ထည့်ပြီး search ရင် loading spinner → weather data (ဒါမှမဟုတ် error message) ကို screen ပေါ်မှာ တွေ့ရမည်။၅ မိနစ် စမ်းကြည့်
Weather app (search TextField + Loading/Success/Error UI) ကို ကိုယ်တိုင် ဆောက်ကြည့်ပါ — city name မှားရိုက်ပြီး error state ကို ထွက်စေအောင် စမ်းကြည့်ပါ။
သတိလေးတစ်ချက်
API rate limit (free tier weather API တွေက request/day ကန့်သတ်ချက် ရှိလေ့ရှိပါတယ်) ကို သတိထားပါ — testing လုပ်ရင်း request ထပ်ခါထပ်ခါ ပို့ပြီး limit ကျော်သွားနိုင်ပါတယ်။