์คํฌ๋ฆฐ์ ๋ํ ์ต์์ Composable์ ๋ค์ด๋ฐ์ ~ScreenContainer()
์ผ๋ก ๊ฐ์ ธ๊ฐ๋๋ค.
์ด๋ ScreenContainer์ ํ๋ผ๋ฏธํฐ์ ๋ทฐ๋ชจ๋ธ์ ์ง์ ํ๊ณ , state์ ๊ตฌ๋ ์ ์ด๊ณณ์์ ์์ํฉ๋๋ค.
@Composable
fun SignInScreenContainer(
modifier: Modifier = Modifier,
viewModel: SignInViewModel = viewModel()
) {
val uiState by viewModel.collectAsState()
...
}
ScreenContainer์ ํ์ Composable๋ก Screen()
๋ฅผ ์ ์ํ๊ณ ScreenContainer
์ ์ด๋ฅผ ์ ์ธํฉ๋๋ค.
@Composable
fun SignInScreen(
uiState: SignInUiState,
modifier: Modifier = Modifier
) {
// ์ฌ๊ธฐ๋ถํฐ ๋ณธ๊ฒฉ์ ์ผ๋ก UI ๋ก์ง ์์ฑ
}
@Composable
fun SignInScreenContainer(
modifier: Modifier = Modifier,
viewModel: SignInViewModel = viewModel()
) {
val uiState by viewModel.collectAsState()
SignInScreen(
uiState = uiState,
modifier = Modifier.fillMaxSize()
)
viewModel.collectSideEffect {
...
}
}
Screen
์ด ์๋ ScreenContent
์ ๋ํ ํ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฐ ์์ผ๋ก ๋ทฐ๋ชจ๋ธ๊ณผ ๋ ๋๋งํ UI ๋ก์ง์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ํ๋ฆฌ๋ทฐ๊ฐ ์ํํ ๋์ํ๋๋ก ํฉ๋๋ค.
@Preview
@Composable
private fun SignInScreenPreview() {
SignInScreen(...)
}
SOPT ๋ด์์ ์ต์์ Composable์ ๋ค์ด๋ฐ์ ~Route()
๋ก ๊ฐ์ ธ๊ฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ค๋น๊ฒ์ด์
๊ฒฝ๋ก ๋ช
๋ ~Route๋ก ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ์, ํผ๋์ด ์๊ธธ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํผ๋์ ์ต์ํํ๊ธฐ ์ํด ์์ ๊ฐ์ ๋ฐฉ์์ ์ฐจ์ฉํฉ๋๋ค.
@Serializable
sealed interface OnboardingRoute {
@Serializable
data object ChoosePlace: OnboardingRoute
@Serializable
data object ChooseFoods: OnboardingRoute
}
...
@Composable
fun OnboardingRoute() { ... }