#1 ๋ฌธ์
#1-1 ๋ฌธ์ ์ํฉ
์ ๋ ฌ๋ ์์ดํ ์ด๊ธฐ์, ๊ฐ ์์ดํ ์ ์๊ฐ์ ์์์ ์๋๋ก ๊ฐ์๋ก ์์์ ธ์ผํ๋ค. ๊ทธ๋ฌ๋, mealId 41์ธ ์์ดํ ๊ณผ mealId 50์ธ ์์ดํ ์ ๋ณด๋ฉด ์ด์ํ ์ ์ด ๋ณด์ธ๋ค. ๋ฐ๋ก mealId 50์ธ ์์ดํ ์ ์๊ฐ์ 18:01:14...๋ก, 17:09:03...์ธ mealId 50๋ณด๋ค ํฐ ๊ฒ์ด๋ค.
#1-2 ๋ฌธ์ ์ฝ๋
...
@Composable
fun NutrientScreen(
...
) {
LaunchedEffect(key1 = true) {
...
}
LaunchedEffect(key1 = true) {
...
}
LaunchedEffect(key1 = viewModel.isInitialized.value) {
if (viewModel.isInitialized.value) {
// ๋ฌดํ ์คํฌ๋กค
snapshotFlow { listState.layoutInfo.visibleItemsInfo }.collect { visibleItemsInfo ->
val totalMaxIndex = listState.layoutInfo.totalItemsCount - 1
val firstVisibleItemIndex = listState.firstVisibleItemIndex
val visibleItemCount = visibleItemsInfo.size
if (totalMaxIndex <= firstVisibleItemIndex + visibleItemCount) {
viewModel.onEvent(NutrientViewModelEvent.LoadMoreItemsAfterLastDayMeal)
}
}
}
}
LazyColumn(
...
) {
...
}
}
์ํ์ฐฉ์ค๋ฅผ ๊ฒช์ผ๋ฉฐ ์๊ฒ๋ ๋ฌธ์ ์ ์์ธ์, viewModel.onEvent()๊ฐ ๋์๋ค๋ฐ์ ์ผ๋ก ์คํ๋๋ ๊ฒ์ด์๋ค. viewModel.onEvent()๋, NutrientViewModelEvent.LoadMoreItemsAfterLastDayMeal๋ฅผ ์ธ์๋ก ๋ฐ์ผ๋ฉด ์ฝ๋ฃจํด(viewModelScope)์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํด Item์ ์ถ๊ฐํด์ค๋ค. ์ฝ๋ฃจํด์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๊ธฐ์, ๋ฐ์ดํฐ ๋ก๋ ์์ฒญ์ด ์๋ฃ๋๊ธฐ ์ ์ ๋ ๋ก๋ ์์ฒญ์ด ๋ค์ด์จ ๊ฒฝ์ฐ ๋จผ์ ๋ฒ์ ์์ฒญ์ ์ดํ์ ์์ฒญ ๊ฐ (์๋ฃ์ ๋ํ) ์์ฐจ์ฑ์ด ๋ณด์ฅ๋์ง ์๋๋ค. ๊ทธ๋์ View๊ฐ ์๋์ ๋ค๋ฅธ ์ด์ํ ํ๋ฉด์ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ํฌ๊ฒ 2๊ฐ์ง ๋ ์ค๋ฅธ๋ค. ๋จผ์ , ๋ฐ์ดํฐ ๋ก๋ ์์ฒญ์ ๋๊ธฐ์ฑ์ ๋ถ์ฌํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ํ๋๋ viewModel.onEvent(NutrientViewModelEvent.LoadMoreItemsAfterLastDayMeal) ์ดํ '๋ฐ์ดํฐ ๋ก๋ ์์ฒญ'์ด ์ฌ๋ฌ ๋ฒ ์ํ๋์ง ์๊ฒ ๋ง๋ ๋ฐฉ๋ฒ์ด๋ค.
์ ์์ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ํ์คํด๋ณด์ด์ง๋ง, ๊ตฌํ์ด ์ฝ์ง ์์ ๋ณด์ธ๋ค. (๋ด ์๊ฐ์ผ ๋ฟ์ด์ง๋ง) ์ฝ๋์ ๊ฐ๋ ์ฑ๋ ๋๋น ์ง ๊ฒ ๊ฐ๋ค. ๋ฐ๋ผ์ ์ฐ์ ํ์์ ๋ฐฉ๋ฒ์ ์๋ํด๋ณธ๋ค. ๋ค๋ง, ๋ฌด์จ ์ง์ ํด๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์๋๋ค๋ฉด ์ ์์ ๋ฐฉ๋ฒ์ ์๋ํด์ผ ํ ๊ฒ์ด๋ค.
#2 ํด๊ฒฐ
#2-1 ์์ธ: ๋๋ฌด ์์ฃผ ๋ณ๊ฒฝ๋๋ State
'๋ฐ์ดํฐ ๋ก๋ ์์ฒญ'์ด ์ฐ๋ฌ์ ์ ๋ฐ๋๋ ์์ธ์, snapshotFlow { ... }์ listState.layoutInfo.visibleItemsInfo๋ฅผ ๋ฃ์ ๋ฐ์ ์๋ค. listState.layoutInfo.visibleItemsInfo๋ LazyColumn์ ๋ณด์ฌ์ง๊ณ ์๋ ์์ดํ ์ ๋ณด๋ก ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ ๋๋ง๋ค ๋์์์ด ๋ณํ๋ค. ์ค์ ๋ก snapshotFlow { listState.layoutInfo.visibleItemsInfo }.collect { visibleItemsInfo -> ... }์ ... ๋ถ๋ถ์ Log.i( ... )๋ฅผ ๋ฃ์ผ๋ฉด ์ด๋ง์ด๋งํ ์์ Log ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋จ์ ํ์ธํ ์ ์๋ค.
#2-2 snapshotFlow๋ฅผ ์ ์ฉํ State ๋ณ๊ฒฝ
// ๋ฌดํ ์คํฌ๋กค
snapshotFlow {
val totalMaxIndex = listState.layoutInfo.totalItemsCount - 1
val firstVisibleItemIndex = listState.firstVisibleItemIndex
val visibleItemCount = listState.layoutInfo.visibleItemsInfo.size
totalMaxIndex <= firstVisibleItemIndex + visibleItemCount
}.collect { shouldLoadMoreData ->
if (shouldLoadMoreData) {
viewModel.onEvent(NutrientViewModelEvent.LoadMoreItemsAfterLastDayMeal)
}
}
์์ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ค. ์ด์ , collect()๊ฐ ์ด์ ๋ณด๋ค ํจ์ฌ ๋ ๋น๋ฒํ ํธ์ถ๋ ๊ฒ์ด๋ค.
#2-3 ์ฐ์ฐํจ
#2-2์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๋ฉด, #1-1์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ํฉ์ด ๋ง๋ํ ํด๊ฒฐ๋๋ค. ํ์ง๋ง, ์ฝ๊ฐ์ ์ฐ์ฐํจ์ด ๋จ๋๋ค. ๋ง์ฝ, shouldLoadMoreData๊ฐ ์ฐ๋ฌ์ true์ธ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๊ทธ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋๋จธ๋ '๋ฐ์ดํฐ ๋ก๋ ์์ฒญ'์ด (๋ณธ ๊ฒ์๊ธ์ ๋ชฉ์ ๊ณผ๋ ๋ฐ๋๋ก) ์ฐ๋ฌ์ ์คํ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๊ณ ์์ ํ ๋ค. ํ์ง๋ง, shouldLoadMoreData๊ฐ ๋ณํ์ง ์๊ธฐ์ ๊ทธ๋ฐ ์ผ์ ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ค. ๋๋ ์ด๊ฒ ๋ง์์ ๋ค์ง ์๋๋ค.
#2-4 Flow.combine() ํ์ฉ
// ๋ฌดํ ์คํฌ๋กค
val shouldLoadMoreData = snapshotFlow {
val totalMaxIndex = listState.layoutInfo.totalItemsCount - 1
val firstVisibleItemIndex = listState.firstVisibleItemIndex
val visibleItemCount = listState.layoutInfo.visibleItemsInfo.size
totalMaxIndex <= firstVisibleItemIndex + visibleItemCount
}
val totalItemCount = snapshotFlow {
listState.layoutInfo.totalItemsCount
}
val loadMoreData = combine(
shouldLoadMoreData,
totalItemCount
) { shouldLoadMoreDataValue, totalItemCountValue ->
Pair(shouldLoadMoreDataValue, totalItemCountValue)
}
loadMoreData.collect { (shouldLoadMoreData, _) ->
if (shouldLoadMoreData) {
viewModel.onEvent(NutrientViewModelEvent.LoadMoreItemsAfterLastDayMeal)
}
}
Flow.combine()์ ์ด์ฉํด, #2-3์ ์ฐ์ฐํจ์ ํด์ํ๋ค. ๊ธฐ์กด์๋ ์ ์ฝ๋์์ shouldLoadMoreData์ ๋ณํ๋ง์ ๊ฐ์งํด collect()ํ์ง๋ง, ์ด์ ๋ totalItemCount์ ๋ณํ๊น์ง ๊ฐ์งํ๋ค. shouldLoadMoreData๊ฐ true๋ก ์ผ์ ํ๊ฒ ์ ์ง๋์ด๋, totalItemCount๊ฐ ๋ณํ๋ฉด '๋ฐ์ดํฐ ๋ก๋ ์์ฒญ'์ด ์ ๋ฐ๋๋ ๊ฒ์ด๋ค.
'๋ฐ์ดํฐ ๋ก๋ ์์ฒญ'์ด ์ด์์ ์ธ ๋ฐฉํฅ์ผ๋ก ์ฐ๋ฌ์ ์คํ๋๋ ์๋๋ฆฌ์ค๋, ๋จผ์ ๋ฒ์ '๋ฐ์ดํฐ ๋ก๋ ์์ฒญ'์ด ์๋ฃ๋์ด View์ Loadํ ๋ฐ์ดํฐ๋ฅผ ๋ฌด์ฌํ ๋ถ์ธ ์งํ ๋ค์ ์ดํ์ '๋ฐ์ดํฐ ๋ก๋ ์์ฒญ'์ด ์คํ๋๋ ์ํฉ์ด๋ค. ์ ์ฝ๋๋๋ก๋ผ๋ฉด, totalItemCount๋ '๋ฐ์ดํฐ ๋ก๋ ์์ฒญ'์ด ์๋ฃ๋จ๊ณผ ๋์์ ๋ณํํ๋ค. ๋ฐ๋ผ์ ์ด์ '๋ฐ์ดํฐ ๋ก๋ ์์ฒญ'๊ณผ ์ดํ '๋ฐ์ดํฐ ๋ก๋ ์์ฒญ' ๊ฐ ์๋ฃ์ ๋ํ ์์ฐจ์ฑ์ด ๋ณด์ฅ๋๋ค.
#3 ์์ฝ
๋ฌดํ ์คํฌ๋กค ๋ก์ง์ด ๊ผฌ์ด์ง ์๊ฒ ๋ฆฌํฉํ ๋งํ๋ค.
#4 ์์ฑ๋ ์ฑ
#4-1 ์คํฌ๋ฆฐ์ท
์ ํ๋ฉด ์์ ์์ดํ ๋ค ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์์ดํ ์ ๋ํด ์ ๋ ฌ์ด ์ ์ ์ง๋๋ค.
#4-2 ์ด ๊ฒ์๊ธ ์์ ์ Commit
GitHub - Kanmanemone/nutri-capture-new
Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.
github.com
#4-3 ๋ณธ ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ต์ Commit
GitHub - Kanmanemone/nutri-capture-new
Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.
github.com
'๊ฐ๋ฐ ์ผ์ง ๐ป > Nutri Capture' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Nutri Capture ๋ฐฑ์๋ - DeleteDayMeal ์ด๋ฒคํธ ์ถ๊ฐ (0) | 2024.11.28 |
---|---|
Nutri Capture ๋ฐฑ์๋ - DAO ๋ ผ๋ฆฌ์ ์ค๋ฅ ์์ (0) | 2024.11.26 |
Nutri Capture ๋ฐฑ์๋ - Room ๋ฌด๊ฒฐ์ฑ ๋ณด์ (1) | 2024.11.15 |
Nutri Capture ํ๋ก ํธ์๋ - ์ฑํ UI ๊ตฌ์กฐ ์ก๊ธฐ (0) | 2024.11.14 |
Nutri Capture ๋ฐฑ์๋ - Room ๊ฐ์ ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ํ์ํ ๋งํผ๋ง ๊ฐ์ ธ์ค๊ธฐ (0) | 2024.11.12 |