๊ฐœ๋ฐœ ์ผ์ง€ ๐Ÿ’ป/Swemo

Nutri Capture - INSERT ๋ฐ DELETE ๋ฒ„ํŠผ ๊ตฌํ˜„

interfacer_han 2024. 11. 28. 18:24

#1 ๊ฐœ์š”

๋ ˆ์ฝ”๋“œ๋ฅผ INSERTํ•˜๋Š” ๋ฒ„ํŠผ๊ณผ DELETEํ•˜๋Š” ๋ฒ„ํŠผ์„ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•œ๋‹ค. 

 

#2 ์ฝ”๋“œ - ๊นจ์•Œ ์ˆ˜์ •

...

@Composable
fun NutrientScreen(
    ...
) {
    ...

    LazyColumn(
        ...
    ) {
        ...
        itemsIndexed(...) { ... ->
            Card(
                ...
                elevation = CardDefaults.cardElevation(4.dp)
            ) {
                ...
            }
        }
    }
}

๋ ˆ์ฝ”๋“œ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๊ฐ์‹ธ๋Š” Card์˜ ๊ทธ๋ฆผ์ž๊ฐ’์„ ์ค„์ธ๋‹ค. ๊ทธ๋ฆผ์ž๊ฐ’์ด 8.dp๋ฉด ๋‹ค๋ฅธ ์นด๋“œ ์˜์—ญ์—๊นŒ์ง€ ๊ทธ๋ฆผ์ž๊ฐ€ ์นจ๋ฒ”ํ•ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

TMI

๋”๋ณด๊ธฐ

์ง€๊ธˆ์€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์œ„์ฃผ๋กœ๋งŒ ๊ฐœ๋ฐœํ•œ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๋งŒ์กฑ๊ฐ์„ ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•œ ์‹œ๊ฐ์  ์ž‘์—…์€ ๋ง‰ํŒ์— ๋ชฐ์•„์„œ, ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์™„์ „ํžˆ ๊ฐˆ์•„์—Ž๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ๊นจ์•Œ ๊ฐ™์€ ์ˆ˜์ • ์‚ฌํ•ญ์— ํฐ ์˜๋ฏธ๋Š” ์—†๋‹ค. ๋‹ค๋งŒ ๊ณผ์ •์ด ๋ณด๊ธฐ ์ข‹๊ณ  ์ฆ๊ฑฐ์›Œ์•ผ ๋” ๋ชฐ์ž…๋˜๊ณ , ํ”„๋กœ์ ํŠธ์— ์• ์ •๋„ ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค.

 

#3 ์ฝ”๋“œ - INSERT ๋ฒ„ํŠผ

#3-1 ๋ชจ์–‘ ์žก๊ธฐ

...

@Composable
fun NutrientScreen(
    ...
) {
    ...

    LazyColumn(
        ...
        reverseLayout = true
    ) {
        item {
            FilledTonalButton(
                onClick = {
                    // TODO
                },
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(
                        start = 8.dp,
                        top = 0.dp,
                        end = 8.dp,
                        bottom = 8.dp
                    ),
                shape = CardDefaults.shape,
                elevation = ButtonDefaults.filledTonalButtonElevation(4.dp)
            ) {
                Text(
                    text = "+",
                    fontSize = 30.sp
                )
            }
        }

        ...
        itemsIndexed(...) { ... ->
            ...
        }
    }
}

LazyColumn์— item { ... } ์˜์—ญ์„ ์„ ์–ธํ•˜๊ณ , ๊ทธ ์•ˆ์— FilledTonalButton์„ ๋„ฃ๋Š”๋‹ค. LazyColumn์˜ reverseLayout ํ”„๋กœํผํ‹ฐ์— true๋ฅผ ๋Œ€์ž…ํ–ˆ์œผ๋ฏ€๋กœ, ์•„์ดํ…œ๋“ค์€ ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค. ๋”ฐ๋ผ์„œ, LazyColumn ๋งจ ์ฒซ ๋ถ€๋ถ„์— ์„ ์–ธ๋œ ์ด FilledTonalButton์€ LazyColumn์˜ ๋งจ ์•„๋žซ ๋ถ€๋ถ„์— ์กด์žฌํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

๋˜ DayMeal ๋ ˆ์ฝ”๋“œ ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ Card์— ๋‹ด๊ฒจ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ†ต์ผ์„ฑ์„ ์œ„ํ•ด์„œ, FilledTonalButton์˜ shape ํ”„๋กœํผํ‹ฐ์— CardDefaults.shape๋ฅผ ๋Œ€์ž…ํ–ˆ๋‹ค. ์ฆ‰, FilledTonalButton์€ ์นด๋“œ ๋ชจ์–‘์ด ๋  ๊ฒƒ์ด๋‹ค.

 

#3-2 ํด๋ฆญ ์‹œ ๋™์ž‘ ์ •์˜

...

@Composable
fun NutrientScreen(
    ...
) {
    ...
    
/* ↓↓↓ viewModel.onEvent(...) ๋ถ€๋ถ„์„ ๋ณต์‚ฌใ†๋ถ™์—ฌ๋„ฃ๊ธฐ ํ›„ LaunchedEffect ์‚ญ์ œ
    LaunchedEffect(key1 = true) {
        repeat(5) {
            viewModel.onEvent(
                NutrientViewModelEvent.InsertMeal(
                    meal = Meal(
                        time = LocalTime.now(),
                        name = "test",
                        nutritionInfo = NutritionInfo()
                    ),
                    date = LocalDate.now()
                )
            )
        }
    }
*/
    ...

    LazyColumn(
        ...
    ) {
        item {
            FilledTonalButton(
                onClick = {
                    viewModel.onEvent(
                        NutrientViewModelEvent.InsertMeal(
                            meal = Meal(
                                time = LocalTime.now(),
                                name = "test",
                                nutritionInfo = NutritionInfo()
                            ),
                            date = LocalDate.now()
                        )
                    )
                },
                ...
            ) {
                ...
            }
        }

        ...
        itemsIndexed(...) { ... ->
            ...
        }
    }
}

onClick = { ... } ์•ˆ์— 'NutrientScreen ์‹คํ–‰ ์‹œ ๋งˆ๋‹ค ๋ ˆ์ฝ”๋“œ๋ฅผ 5๊ฐœ์”ฉ INSERT์‹œ์ผฐ๋˜ LaunchedEffect'์˜ INSERT ์ด๋ฒคํŠธ๋ฅผ ๋ณต์‚ฌใ†๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•œ๋‹ค. 'NutrientScreen ์‹คํ–‰ ์‹œ ๋งˆ๋‹ค ๋ ˆ์ฝ”๋“œ๋ฅผ 5๊ฐœ์”ฉ INSERT์‹œ์ผฐ๋˜ LaunchedEffect'๋Š” ์ด์ œ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์‚ญ์ œํ•œ๋‹ค.

 

#4 ์ฝ”๋“œ - DELETE ๋ฒ„ํŠผ

#4-1 ๋ชจ์–‘ ์žก๊ธฐ

...

@Composable
fun NutrientScreen(
    ...
) {
    ...

    LazyColumn(
        ...
    ) {
        item {
            ...
        }

        ...
        itemsIndexed(dayMeals) { index, dayMeal ->
            Card(
                ...
            ) {
                Box(
                    modifier = Modifier.fillMaxSize()
                ) {
                    Column(
                        ...
                    ) {
                        ...
                    }

                    IconButton(
                        onClick = {
                            // TODO
                        },
                        modifier = Modifier.align(Alignment.TopStart)
                    ) {
                        Icon(
                            imageVector = Icons.Default.Delete,
                            contentDescription = "Delete",
                            modifier = Modifier.size(24.dp)
                        )
                    }
                }
            }
        }
    }
}

Column์„ Box์— ๋„ฃ๊ณ , IconButton๋ฅผ Box์˜ TopStart ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ•œ๋‹ค.

 

#4-2 ํด๋ฆญ ์‹œ ๋™์ž‘ ์ •์˜

...

@Composable
fun NutrientScreen(
    ...
) {
    ...

    LazyColumn(
        ...
    ) {
        item {
            ...
        }

        ...
        itemsIndexed(dayMeals) { index, dayMeal ->
            Card(
                ...
            ) {
                Box(
                    modifier = Modifier.fillMaxSize()
                ) {
                    Column(
                        ...
                    ) {
                        ...
                    }

                    IconButton(
                        onClick = {
                            viewModel.onEvent(
                                NutrientViewModelEvent.DeleteDayMeal(
                                    dayMeal = dayMeal
                                )
                            )
                        },
                        modifier = Modifier.align(Alignment.TopStart)
                    ) {
                        Icon(
                            imageVector = Icons.Default.Delete,
                            contentDescription = "Delete",
                            modifier = Modifier.size(24.dp)
                        )
                    }
                }
            }
        }
    }
}

์ด์ „ ๊ฒŒ์‹œ๊ธ€์—์„œ ๋งŒ๋“ค์—ˆ๋˜ DeleteDayMeal() ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

#5 ์™„์„ฑ๋œ ์•ฑ

#5-1 ์Šคํฌ๋ฆฐ์ƒท

 

#5-2 ์ด ๊ฒŒ์‹œ๊ธ€ ์‹œ์ ์˜ Commit

 

GitHub - Kanmanemone/nutri-capture-new

Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.

github.com

 

#5-3 ๋ณธ ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์žฅ ์ตœ์‹  Commit

 

GitHub - Kanmanemone/nutri-capture-new

Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.

github.com