#1 ๊ฐ์
์ด์ ๊ฒ์๊ธ์์ ๋ถ์์ ํ ๋ฌดํ ์คํฌ๋กค์ ๊ตฌํํ์๋ค. ๊ทธ ๋ถ์์ ํจ์ ๋ณด์ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์์, ๋จผ์ ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ตํต ์ ๋ฆฌํ๊ฒ ๋ค. ์ฒซ์งธ๋ก๋ ์ด๊ธฐ ํ๋ฉด์์ ๋ณด์ผ Item์ ํ๋์์ 20๊ฐ๋ก ๋๋ฆฐ๋ค. ์ด๊ธฐ Item์ด ํ๋ ๋ฟ์ด๋ฉด ์๋ซ ๋ฐฉํฅ ๋ฌดํ ์คํฌ๋กค ๋ก์ง๊ณผ ์ญ๋ฐฉํฅ(์ ๋ฐฉํฅ) ๋ฌดํ ์คํฌ๋กค ๋ก์ง์ด ๋์์ ์๋ํ๊ธฐ์ ์ด๋ฅผ ์ง๊ด์ ์ผ๋ก ๋ค๋ฃจ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ด๋ค. 20๊ฐ๋ผ๋ ์ซ์๋ Item๋ค์ด ํ๋ฉด์ ๊ฐ๋ ์ฑ์ธ๋งํ ์๋ฌด ์ซ์๋ค. ํน์ ์ซ์๋ก ํ๋ ์ฝ๋ฉํ๋ ๊ฒ ์ฉ ๋ดํค์ง๋ ์์ง๋ง, ์ผ๋จ ์ง๊ธ์ ๋ฌดํ ์คํฌ๋กค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ ๊ธ์ ๋ฌด๋ค. ๋์ค์ ์ํํธ ์ฝ๋ฉ์ผ๋ก ๋ฐ๊พธ๊ฒ ๋ค.
๋, ๋ฌดํ ์คํฌ๋กค ๋ก์ง์ด ์ด๊ธฐํ๊ฐ ์์ ํ ์๋ฃ๋ ํ์ ์๋ํ๋๋ก ๋ง๋ค ๊ฒ์ด๋ค. ์ด๋ฅผ ์ํด ๋ทฐ ๋ชจ๋ธ์ ์ด๊ธฐํ ์๋ฃ ์ ๋ณด๋ฅผ ๋ด๋ Booleanํ ํ๋กํผํฐ๋ฅผ ์ ์ธํ ๊ฒ์ด๋ค.
#2 ์ฝ๋
#2-1 ViewModel์ isInitialized ํ๋กํผํฐ ์ ์ธ
...
class NutrientViewModel : ViewModel() {
// (1) ํ๋ฉด ํ์์ฉ State
...
// (2) ViewModel์ฉ ๋ด๋ถ ๋ณ์
private val _isInitialized = mutableStateOf(false)
val isInitialized: State<Boolean>
get() = _isInitialized
// (3) View์์ ๋ฐ์ ์ฒ๋ฆฌํ ์ด๋ฒคํธ
...
// (4) View๋ก๋ถํฐ ๋ฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
fun onEvent(event: NutrientViewModelEvent) {
...
}
}
State๋ก ์ ์ธํด์ผ Jetpack Compose Runtime์ด ๊ฐ์ ๋ณ๊ฒฝ์ ๊ฐ์งํ ์ ์๋ค. (1) ํ๋ฉด ํ์์ฉ State์ isInitialized๋ฅผ ๋ฃ์ง ์์ ์ด์ ๋ (1)์๋ ๋์ ๋ณด์ด๋ UI์ ๊ด๋ จ๋ ๊ฒ๋ง ๋ฃ๊ธฐ๋ก ๊ท์น์ ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์น ์ฌ์ง๋ค์ ์นดํ ๊ณ ๋ฆฌ ๋ณ๋ก ๋๋ ๊ฐ๊ฐ์ ์จ๋ฒ์ ๋ถ๋ฅํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ง์ด๋ค. isInitialized๋ ์ฌ์ฉ์์ ๋์ ๋ณด์ด์ง ์๋ ๋ด๋ถ์ ์ธ ๋์์ ๊ด๋ จ๋ ํ๋กํผํฐ๊ณ , ์์ผ๋ก๋ ์ด์ ์ ์ฌํ ํ๋กํผํฐ๊ฐ ํ์ํ๋ค๋ฉด (2)์ ์์ญ์ ์ ์ธํ๊ธฐ๋ก ํ๋ค.
#2-2 LazyColumn์์ ํ์ํ ์์ดํ ์ ์ด๊ธฐ ๊ฐฏ์๋ฅผ 1๊ฐ์์ 20๊ฐ๋ก ๋ณ๊ฒฝ
...
class NutrientViewModel : ViewModel() {
// (1) ํ๋ฉด ํ์์ฉ State
...
// (2) ViewModel์ฉ ๋ด๋ถ ๋ณ์
...
// (3) View์์ ๋ฐ์ ์ฒ๋ฆฌํ ์ด๋ฒคํธ
...
// (4) View๋ก๋ถํฐ ๋ฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
fun onEvent(event: NutrientViewModelEvent) {
when (event) {
is NutrientViewModelEvent.InitializeState -> {
var dateToInsert = LocalDate.now()
repeat(20) {
_nutrientScreenState.value.dailyMeals.add(
DailyMeal(
date = dateToInsert,
meals = SnapshotStateList()
)
)
dateToInsert = dateToInsert.plusDays(1)
}
_isInitialized.value = true
}
...
}
}
}
add() ์์ ์ด ์๋ฃ๋๋ฉด ๋ฐฉ๊ธ ๋ง๋ค์๋ isInitialized์ true๋ฅผ ํ ๋นํ๋ค.
#2-3 LaunchedEffect ๋ถ๋ฆฌ
...
@Composable
fun NutrientScreen(
...
) {
...
LaunchedEffect(key1 = true) {
// State ์ด๊ธฐํ
...
// ViewModel๋ก๋ถํฐ ๋ฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
viewModel.nutrientScreenEventFlow.collectLatest { ... ->
...
}
}
LaunchedEffect(key1 = viewModel.isInitialized.value) {
if(viewModel.isInitialized.value) {
// ๋ฌดํ ์คํฌ๋กค
snapshotFlow { ... }.collect { ... ->
...
}
}
}
LazyColumn(
...
) {
...
}
}
LaunchedEffect๋ฅผ 2๊ฐ๋ก ๋ถ๋ฆฌํ๋ค. ์๋ก ๋ง๋ LaunchedEffect์ ๋ฌดํ ์คํฌ๋กค ๊ด๋ จ ์ฝ๋๋ฅผ ์ฎ๊ฒจ ๋ฃ๋๋ค. ์๋ก ๋ง๋ LaunchedEffect์ key๋ ์๊น ๋ง๋ isInitialized์ value๋ฅผ ๋ฃ๊ณ ํด๋น ๊ฐ์ด true์ผ๋๋ง ๋ด์ฉ๋ฌผ์ด ๋์ํ๊ฒ ๋ง๋ ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, ์ด๊ธฐํ๊ฐ ์๋ฃ๋์ด์ผ ๋น๋ก์ ๋ฌดํ ์คํฌ๋กค์ด ์๋ํ๋ค. ์ด ๋ณ๊ฒฝ ์ฌํญ์ ์ง๊ธ์ผ๋ก์ ํฐ ์๋ฏธ๊ฐ ์์ด๋ณด์ด์ง๋ง, ๋ถ๋ช ์ ์ฌ์ ์ธ ์๋ฌ๋ฅผ ์ค์ฌ์ค ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋ค.
#3 ์์ฝ
๋ฌดํ ์คํฌ๋กค ๋ก์ง์ด ์ด๊ธฐํ ์ดํ ์๋ํ๋๋ก ๋ณ๊ฒฝํ๋ค.
#4 ์์ฑ๋ ์ฑ
#4-1 ์ด ๊ฒ์๊ธ ์์ ์ Commit
GitHub - Kanmanemone/nutri-capture-new
Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.
github.com
#4-2 ๋ณธ ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ต์ Commit
GitHub - Kanmanemone/nutri-capture-new
Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.
github.com