UiState
๋ผ๋ sealed interface๋ฅผ ์์ฑํ๋ ๊ฒ๋ถํฐ ์์ํฉ๋๋ค. UiState
๋ (ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ) ๊ฐ ํ๋ฉด ๋น ํ๋์ฉ ์กด์ฌํ๋ฉฐ, ViewModel ํ๋จ์ ์์ฑํฉ๋๋ค.
์ด๋ sealed interface๋ ๋ณดํต์ ๊ฒฝ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ์์์ ๊ฐ์ต๋๋ค.
sealed interface MyPageUiState {
data class Success(val userInfo: UserInfo) : MyPageUiState
data object Loading : MyPageUiState
data object LoadFailed : MyPageUiState
}
์ด์ ContainerHost
์ STATE ํ์
์ผ๋ก ํด๋น UiState
๋ฅผ ์ง์ ํด์ค๋๋ค.
class MyPageViewModel(
...
) : ContainerHost<MyPageUiState, Nothing>, ViewModel() {
...
}
์ด UiState
๋ฅผ ์ด๋ป๊ฒ ์ด๊ธฐํํ๊ณ , ๋๋ ์ํ๋ฅผ ์
๋ฐ์ดํธ ํ๋์ง๋ ์ดํ์ ํ์ธํ๊ณ , ์ฐ์ ์ ์์ ๊ฐ์ UiState๋ฅผ UI์์ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
UiState๋ฅผ ์ฐ์ง ์๋ ๋ฐฉ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, Composable์์ state๋ฅผ ๊ตฌ๋ ํ๋ ๊ฒ๋ถํฐ ์์ํฉ๋๋ค.
@Composable
fun MyPageScreen(...) {
val uiState by viewModel.collectAsState()
MyPageScreenContent(
uiState = uiState,
...
)
}
๋ค์์ผ๋ก, MyPageScreenContent
์์๋ ๋๊ฒจ๋ฐ์ uiState๋ฅผ ๋ถ๊ธฐํ์ฌ ๊ฐ ์กฐ๊ฑด์ ํด๋นํ๋ UI๋ฅผ ์์ฑํฉ๋๋ค.
@Composable
fun MyPageScreenContent(
uiState: MyPageUiState,
modifier: Modifier = Modifier
) {
...
when(uiState) {
is MyPageUiState.Success -> {
// ์ด ์์์๋ userInfo ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์
...
}
MyPageUiState.Loading -> {
// ๋ก๋ฉ ๋ทฐ
}
MyPageUiState.LoadFailed -> {
// ๋ฐ์ดํฐ ๋ก๋ ์คํจ ๋ทฐ (์๋ฌ)
}
}
}