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

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - Card

interfacer_han 2024. 10. 17. 02:29

#1 ๊ฐœ์š”

์Šคํฌ๋กค ๊ด€๋ จํ•ด์„œ๋Š” ํ•œ์‹œ๋ฆ„ ๋†“์•˜๋‹ค. ๋ณธ ๊ฒŒ์‹œ๊ธ€์—์„  LazyColumn์˜ ๊ฐ ์•„์ดํ…œ์„ Card๋กœ ๊ฐ์‹ธ๊ณ  ์•ฝ๊ฐ„์˜ ๋””์ž์ธ์  ์ˆ˜์ •์„ ํ•  ๊ฒƒ์ด๋‹ค. ๋ณธ ๊ฒŒ์‹œ๊ธ€๊นŒ์ง€ํ•ด์„œ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์ค‘๊ฐ„ ๋งบ์Œ์„ ํ•  ๊ฒƒ์ด๊ณ  ๋‹ค์Œ ๊ฒŒ์‹œ๊ธ€๋ถ€ํ„ฐ๋Š” ์•„๋งˆ ๋ฐฑ์—”๋“œ ๊ตฌํ˜„์œผ๋กœ ๋„˜์–ด๊ฐˆ๋“ฏ ์‹ถ๋‹ค.
 

#2 ์ฝ”๋“œ

#2-1 (ํ‹€ ์žก๊ธฐ) Card()

...

@Composable
fun NutrientScreen(
    ...
) {
    LaunchedEffect(key1 = true) {
        // State ์ดˆ๊ธฐํ™”
        ...

        // ViewModel๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
        ...
    }

    LaunchedEffect(key1 = viewModel.isInitialized.value) {
        ...
    }

    LazyColumn(
        ...
    ) {
        val dailyMeals = viewModel.nutrientScreenState.value.dailyMeals
        items(dailyMeals) { dailyMeal ->
            Card(
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(
                        start = 8.dp,
                        top = 8.dp,
                        end = 8.dp,
                    ),
                elevation = CardDefaults.cardElevation(8.dp)
            ) {
                Text(
                    ...
                )
            }
        }
    }
}

item์„ Card๋กœ ๊ฐ์‹ผ๋‹ค. ๋„ˆ๋น„๋Š” ๋ถ€๋ชจ์˜ ์ตœ๋Œ€ ๋„ˆ๋น„๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋‘๊ณ  ์ ๋‹นํ•œ padding์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. ๋˜, Card์™€ ํŠน์ง•์ธ elevation๋„ ์ ๋‹นํ•œ ๊ฐ’์œผ๋กœ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. 
 

#2-2 (๋ชจ์–‘ ์žก๊ธฐ ์ค€๋น„) utils ํŒจํ‚ค์ง€ ๋งŒ๋“ค๊ณ  DateFormatter.kt ์ƒ์„ฑ

// package com.example.nutri_capture_new.utils

import java.time.LocalDate
import java.time.format.TextStyle
import java.util.Locale

object DateFormatter {
    fun formatDateForNutrientScreen(date: LocalDate): String {
        val month = date.monthValue
        val day = date.dayOfMonth
        val dayOfWeek = date.dayOfWeek.getDisplayName(TextStyle.FULL, Locale.KOREAN)

        return "${month}์›” ${day}์ผ $dayOfWeek"
    }
}

"2024-10-17"์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋˜๋˜ ๋‚ ์งœ๋ฅผ "10์›” 17์ผ ๋ชฉ์š”์ผ"๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ฃผ๋Š” ํ•จ์ˆ˜๋‹ค.
 

#2-3 (๋ชจ์–‘ ์žก๊ธฐ) Text() ์ˆ˜์ • ๋ฐ Column์œผ๋กœ ๊ฐ์‹ธ๊ธฐ

...

@Composable
fun NutrientScreen(
    ...
) {
    LaunchedEffect(key1 = true) {
        ...
    }

    LaunchedEffect(key1 = viewModel.isInitialized.value) {
        ...
    }

    LazyColumn(
        state = listState,
        modifier = Modifier.fillMaxSize()
    ) {
        val dailyMeals = viewModel.nutrientScreenState.value.dailyMeals
        items(dailyMeals) { dailyMeal ->
            Card(
                ...
            ) {
                Column(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(8.dp)
                ) {
                    Text(
                        text = DateFormatter.formatDateForNutrientScreen(dailyMeal.date),
                        modifier = Modifier.fillMaxWidth(),
                        fontSize = 15.sp,
                        textAlign = TextAlign.End
                    )
                }
            }
        }
    }
}

LazyColumn()์˜ ๋ฐฐ๊ฒฝ์ƒ‰๊ณผ Text()์˜ ๊ธ€์ž์ƒ‰์„ ์ง€์ •ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค. ์ฆ‰ ๊ธฐ๋ณธ๊ฐ’ ์ƒ‰์œผ๋กœ ๋‘”๋‹ค.
 
Text()์—์„œ ๊ธ€์ž ํฌ๊ธฐ๋ฅผ 15.sp๋กœ ์ค„์ด๊ณ  ๊ธฐ๋ณธ๊ฐ’์ธ ์ขŒ์ธก ์ •๋ ฌ ์„ค์ •์„ ์šฐ์ธก ์ •๋ ฌ๋กœ ๋ฐ”๊ฟจ๋‹ค. ๋˜ #2-2์˜ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•ด, ๋‚ ์งœ๊ฐ€ "10์›” 17์ผ ๋ชฉ์š”์ผ"๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.
 
๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜์ •ํ•œ Text()๋ฅผ Column()์œผ๋กœ ๊ฐ์‹ผ๋‹ค. Column์—๋Š” padding์„ 8.dp๋กœ ์ง€์ •ํ–ˆ๋‹ค.
 

#2-4 ์ƒ˜ํ”Œ ์ปจํ…์ธ  Column์— ๋„ฃ์–ด์ฃผ๊ธฐ

...

@Composable
fun NutrientScreen(
    scope: CoroutineScope,
    snackbarHostState: SnackbarHostState,
    viewModel: NutrientViewModel = viewModel<NutrientViewModel>(),
    listState: LazyListState = rememberLazyListState()
) {
    LaunchedEffect(key1 = true) {
        // State ์ดˆ๊ธฐํ™”
        ...

        // ViewModel๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
        ...
    }

    LaunchedEffect(key1 = viewModel.isInitialized.value) {
        ...
    }

    LazyColumn(
        ...
    ) {
        ...
        items(dailyMeals) { dailyMeal ->
            Card(
                ...
            ) {
                Column(
                    ...
                ) {
                    Text(
                        ...
                    )

                    SampleContent(
                        text = "Sample ์˜์–‘ ์ •๋ณด",
                        modifier = Modifier
                            .fillMaxWidth()
                            .height(100.dp),
                        scope = scope,
                        snackbarHostState = snackbarHostState
                    )
                }
            }
        }
    }
}

Column()์— Text() ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฑด ํ—ˆ์ „ํ•˜๋‹ˆ๊นŒ, MainActivity.kt์— ์ •์˜ํ•ด๋‘์—ˆ๋˜ SampleContent()๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
 

#3 ์š”์•ฝ

LazyColumn์˜ ์•„์ดํ…œ์„ Card()๋กœ ๊ฐ์‹ธ๊ณ , ๋””์ž์ธ์ ์œผ๋กœ ์‚ด์ง ๋‹ค๋“ฌ์—ˆ๋‹ค.
 

#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