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

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - NutrientBottomSheet ๋ถ€๋ถ„ ๊ตฌํ˜„

#1 ๊ฐœ์š” Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - 'ํ”ผ์ž' ์•„์ด์ฝ˜ ์ž„์‹œ ์ ์šฉ#1 ์ปค์Šคํ…€ ์•„์ด์ฝ˜ ์ž„์‹œ ์ ์šฉ#1-1 ์ปค์Šคํ…€ ์•„์ด์ฝ˜ Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - 'ํ”ผ์ž' ์•„์ด์ฝ˜ ๊ตฌํ˜„#1 ๊ฐœ์š”#1-1 ์ง€๊ธˆ๊นŒ์ง€์˜ ์—ฌ์ • Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - ์ปค์Šคํ…€ BottomSheetScaffold ๊ฐœ๋ฐœ ์œ ์˜ˆ#1 ๊ฐœ์š”#1-1 ๊ฐœ๋ฐœ ์ดkenel.tistory.com์œ„ ๊ฒŒ์‹œ๊ธ€์—์„œ ๋ชป๋‹คํ•œ ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.  #2 ์ฝ”๋“œ ์Šค๋‹ˆํŽซ#2-1 NutritionBottomSheet.kt...@Composablefun NutrientBottomSheet( viewModel: NutrientViewModel = hiltViewModel()) { val inputtedDayMeal = viewModel.nutrie..

Nutri Capture ๋ฐฑ์—”๋“œ - NutritionInfo ๋ฆฌํŒฉํ† ๋ง

#1 ๋ฌธ์ œ์ #1-1 ๋ฆฌํŒฉํ† ๋งํ•  ๊ธฐ์กด ์ฝ”๋“œpackage com.example.nutri_capture_new.dbimport androidx.room.ColumnInfodata class NutritionInfo( // ๊ณผ์‹ ์ •๋„๊ฐ’ @ColumnInfo(name = "overeating_excess") var overeatingExcess: Int = 0, // ์ •์ œ๋‹น ์„ญ์ทจ ์ •๋„๊ฐ’ @ColumnInfo(name = "refined_sugar_excess") var refinedSugarExcess: Int = 0, // ์ •์ œ ๊ณก๋ฌผ ์„ญ์ทจ ์ •๋„๊ฐ’ @ColumnInfo(name = "refined_grain_excess") var refinedGrainExcess..

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - 'ํ”ผ์ž' ์•„์ด์ฝ˜ ์ž„์‹œ ์ ์šฉ

#1 ์ปค์Šคํ…€ ์•„์ด์ฝ˜ ์ž„์‹œ ์ ์šฉ#1-1 ์ปค์Šคํ…€ ์•„์ด์ฝ˜ Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - 'ํ”ผ์ž' ์•„์ด์ฝ˜ ๊ตฌํ˜„#1 ๊ฐœ์š”#1-1 ์ง€๊ธˆ๊นŒ์ง€์˜ ์—ฌ์ • Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - ์ปค์Šคํ…€ BottomSheetScaffold ๊ฐœ๋ฐœ ์œ ์˜ˆ#1 ๊ฐœ์š”#1-1 ๊ฐœ๋ฐœ ์ด์œ ๋ง๋กœ ์„ค๋ช…ํ•˜๊ธฐ ํž˜๋“ค์ง€๋งŒ, BottomSheetScaffold์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ด์ง๋งŒ ๋ฐ”๊พธ๋ฉด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™kenel.tistory.com์ด์ „์— ๋งŒ๋“  ์•„์ด์ฝ˜์ด๋‹ค. ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ, ์šฐ์„  ๋ณธ ํ”„๋กœ์ ํŠธ์— ์ ์šฉ๋ถ€ํ„ฐ ํ•ด๋ดค๋‹ค. #1-2 ์ž„์‹œ ์ ์šฉ ์ฝ”๋“œ...@Composablefun NutrientBottomSheet( viewModel: NutrientViewModel = hiltViewModel()) { val inputtedDayMeal = view..

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - 'ํ”ผ์ž' ์•„์ด์ฝ˜ ๊ตฌํ˜„

#1 ๊ฐœ์š”#1-1 ์ง€๊ธˆ๊นŒ์ง€์˜ ์—ฌ์ • Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - ์ปค์Šคํ…€ BottomSheetScaffold ๊ฐœ๋ฐœ ์œ ์˜ˆ#1 ๊ฐœ์š”#1-1 ๊ฐœ๋ฐœ ์ด์œ ๋ง๋กœ ์„ค๋ช…ํ•˜๊ธฐ ํž˜๋“ค์ง€๋งŒ, BottomSheetScaffold์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ด์ง๋งŒ ๋ฐ”๊พธ๋ฉด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  internal์ด๋‚˜ private ์ ‘๊ทผ ์ง€์ •์ž๊ฐ€ ๋ถ™์€ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋‚ดkenel.tistory.com์œ„ ๊ฒŒ์‹œ๊ธ€์—์„œ ๋ณด๋“ฏ, ์›๋ž˜๋Š” ์˜์–‘ ์ •๋ณด ์ž…๋ ฅ์„ ์œ„ํ•œ ์ปค์Šคํ…€ ํ‚ค๋ณด๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ์—ˆ๋‹ค. ์ด ์ปค์Šคํ…€ ํ‚ค๋ณด๋“œ๋Š” BottomSheetScaffold์˜ BottomSheet์— ๋“ค์–ด๊ฐˆ ์˜ˆ์ •์ด์—ˆ๋‹ค. ์ˆœ์ • BottomSheetScaffold๋กœ๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ปค์Šคํ…€ BottomSheetScaffold๋ฅผ ๋งŒ๋“ค..

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - ์ปค์Šคํ…€ BottomSheetScaffold ๊ฐœ๋ฐœ ์œ ์˜ˆ

#1 ๊ฐœ์š”#1-1 ๊ฐœ๋ฐœ ์ด์œ ๋ง๋กœ ์„ค๋ช…ํ•˜๊ธฐ ํž˜๋“ค์ง€๋งŒ, BottomSheetScaffold์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ด์ง๋งŒ ๋ฐ”๊พธ๋ฉด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  internal์ด๋‚˜ private ์ ‘๊ทผ ์ง€์ •์ž๊ฐ€ ๋ถ™์€ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋‚ด๊ฐ€ ์ปค์Šคํ…€ํ•  ์ˆ˜๋„ ์—†๋Š” ๋…ธ๋ฆ‡์ด์—ˆ๋‹ค. publicํ•œ ํ•จ์ˆ˜๋“ค๋กœ ๊ตฌํ˜„๋„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฑธ ํ•ด๋ดค๋‹ค. ๊ฒฐ๊ตญ ๊นŠ์ˆ™ํžˆ ํŒŒ๊ณ ๋“ค์–ด๋ณธ ๊ฒฐ๊ณผ, ๋ฐ˜๋“œ์‹œ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์•ผ๋งŒ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค. ์ •ํ™•ํžˆ๋Š”, NestedScrollConnection์˜ ๊ธฐ์ œ๋ฅผ ์•Œ๊ฒŒ๋˜๊ณ ๋‚˜์„œ ๊นจ๋‹ฌ์•˜๋‹ค. ์ˆœ์ • BottomSheetScaffold์— ๊ฐ€ํ•ด์ง€๋Š” ์‚ฌ์šฉ์ž์˜ ํ„ฐ์น˜ ์ž…๋ ฅ(Pointer input)์€ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ(์ธ ๋‚ด๋ถ€ ์ฝ”๋“œ)๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋Š”๋ฐ, ์ด๋ฅผ ๋ง‰์„ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ๋œ ๊ฒƒ์ด๋‹ค...

Nutri Capture ๋ฐฑ์—”๋“œ - Hilt ๋„์ž…

#1 ๊ฐœ์š”#1-1 Hilt ๋„์ž…๊ณ„ํšํ‘œ ์ƒ, Hilt ๋„์ž…์€ ๋์ž๋ฝ ๋‹จ๊ณ„์˜€๋‹ค. ํ•˜์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ์งœ๊ฐ€๋ฉฐ ์•ฑ์„ ๊ตฌํ˜„ํ•ด๋‚˜๊ฐ€๋Š” ๋ฐ์— ์—ฌ๋Ÿฌ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋“ค์ด ๋‚˜๋ฅผ ๊ฑฐ์Šฌ๋ฆฌ๊ฒŒ ํ–ˆ๋‹ค. Hilt๋กœ ํ˜„์กดํ•˜๋Š” ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ ๊ทธ๋ฆฌ๊ณ  ์ž ์žฌ์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋“ค์„ ์„ ์ œ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋Š” ํŽธ์ด ๋” ์ข‹์„ ๊ฒƒ์ด๋ž€ ํŒ๋‹จ์„ ๋‚ด๋ ธ๋‹ค. #1-2 ๊ธฐ๋ฐ˜ (๋ ˆํผ๋Ÿฐ์Šค) [Android] Dagger2 - Hilt๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜#1 Hilt ๊ฐœ์š” Hilt๋ฅผ ์‚ฌ์šฉํ•œ ์ข…์† ํ•ญ๋ชฉ ์‚ฝ์ž…  |  Android Developers์ด ํŽ˜์ด์ง€๋Š” Cloud Translation API๋ฅผ ํ†ตํ•ด ๋ฒˆ์—ญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Hilt๋ฅผ ์‚ฌ์šฉํ•œ ์ข…์† ํ•ญ๋ชฉ ์‚ฝ์ž… ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผkenel.tistory.com์œ„ ๊ฒŒ์‹œ๊ธ€์— ๊ธฐ๋ฐ˜ํ•ด, ๋ณธ ์•ˆ๋“œ๋กœ์ด๋“œ์— Hilt๋ฅผ ๋„์ž…ํ•œ..

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - windowInsetsPadding()

#1 ๋ฌธ์ œ ์ƒํ™ฉScaffold์˜ bottomBar ์†์— Row(). ๊ทธ Row() ์†์— TextField()๊ฐ€ ์žˆ๋Š” ๊ตฌ์กฐ๋‹ค. TextField()๋ฅผ ํด๋ฆญํ•˜๋ฉด ์†Œํ”„ํŠธํ‚ค๋ณด๋“œ๊ฐ€ Row() ์ง์ „๊นŒ์ง€ ์˜ฌ๋ผ์˜ค๋Š” ๊ฑธ ์˜๋„ํ–ˆ์œผ๋‚˜, ์‹ค์ œ๋กœ๋Š” Row()์˜ ์˜์—ญ์„ ์นจ๋ฒ”ํ•˜์—ฌ TextField() ์ง์ „๊นŒ์ง€ ์˜ฌ๋ผ์˜จ๋‹ค. #2 ์ฝ”๋“œ ์Šค๋‹ˆํŽซScaffold( modifier = Modifier .fillMaxSize() .windowInsetsPadding(WindowInsets.ime), // Modifier์—  windowInsetsPadding()์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ์‹œ์Šคํ…œ UI (์—ฌ๊ธฐ์„œ๋Š” ime(๊ฐ€์ƒํ‚ค๋ณด๋“œ)) ์˜์—ญ์— ๊ฐ€๋ ค์ง€์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ์ฃผ์˜ํ•  ์ ์€, windowInsetsPadding()์„ ๋ฐ˜๋“œ์‹œ Sca..

Nutri Capture - ์ฝ”๋“œ ์ •๋ฆฌ

#1 ๊ฐœ์š”์ฝ”๋“œ ์ตœ์ ํ™”๋ฅผ ํ•˜๊ธฐ ์•ž์„œ ๋‹น์žฅ ํ•„์š”์—†๋Š”, ๊ณ„๋ฅต๊ณผ๋„ ๊ฐ™์€ ์ฝ”๋“œ ์ „๋ถ€ ์ œ๊ฑฐํ–ˆ๋‹ค. ์ผ๋ก  ๋จธ์Šคํฌ์˜ ์‚ฌ๊ณ ๋ฒ•์— ์˜ํ•˜๋ฉด, "์ด๊ฑด ๊ฒฐ๊ตญ ๋‹ค์‹œ ๋„ฃ์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์€๋ฐ?"๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์ง€ ์•Š์œผ๋ฉด ์ถฉ๋ถ„ํžˆ ์ œ๊ฑฐํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด๋ฏ€๋กœ ์ •๋ง ์ฒ ์ €ํ•˜๊ฒŒ ์ œ๊ฑฐํ–ˆ๋‹ค. #2 ์ฝ”๋“œ ์Šค๋‹ˆํŽซ#2-1 ์œ„์ž„ ํ”„๋กœํผํ‹ฐ [Kotlin] ์œ„์ž„ ํ”„๋กœํผํ‹ฐ (Delegated properties)#1 Delegated properties#1-1 ๊ฐœ์š” Delegated properties | Kotlin kotlinlang.org์œ„์ž„ ํ”„๋กœํผํ‹ฐ๋Š”, getter์™€ setter ๋กœ์ง์„ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์œ„์ž„(delegate)ํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋ณธ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” ์œ„์ž„ ํ”„๋กœํผkenel.tistory.com์œ„์™€ ๊ฐ™์ด ์œ„์ž„ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋†“๊ณ  ์ •์ž‘ ํ”„..

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - ์•„์ด์ฝ˜ ์ œ์ž‘ (1์ฐจ)

#1 ๊ฐœ์š”#1-1 ์ผ์ • Nutri Capture ๋ฐฉํ–ฅ์„ฑ - ๊ฐœ๋ฐœ ์ผ์ •ํ‘œ (1์ฐจ)#1 ํ˜„ ๊ฐœ๋ฐœ ํ–‰ํƒœ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ #1-1 ๊ณผ์ •์˜ ์™„๋ฒฝ์ฃผ์˜๋‚œ ํ’‹๋‚ด๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์— ๋ถˆ๊ณผํ•˜๋‹ค. ๋‚ด๊ฐ€ ๋งŒ๋“ค ์•ฑ ๋˜ํ•œ ๊ทธ์ € ๊ทธ๋Ÿฐ ์•ฑ์ผ ๊ฒƒ์ด๋‹ค. ์ ์–ด๋„ ์ฒ˜์Œ (์ถœ์‹œํ•  ์˜๋„๋กœ ๋งŒ๋“œ๋Š”) ์•ฑ์„ ๋‹น์—ฐํžˆ ๊ทธ๋Ÿด ๊ฒƒ์ด๋‹ค,kenel.tistory.com์ด์ „ ๊ฒŒ์‹œ๊ธ€์—์„œ 'ChatBar๋ฅผ ํ†ตํ•ด ์ „์†กํ•œ MealItem์˜ name ์†์„ฑ์„ LazyColumn์—์„œ ํ™•์ธ'ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด์ œ ๋‹ค์Œ ์ž‘์—…์€ ๊ณ„ํšํ‘œ ์ƒ, 'nutritionInfo ๊ฐ ํ”„๋กœํผํ‹ฐ์— 1๋Œ€1๋กœ ๋Œ€์‘๋˜๋Š” ์•„์ด์ฝ˜์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ œ์ž‘ํ•จ'์ด๋‹ค. #1-2 ์•„์ด์ฝ˜์•„์ด์ฝ˜์„ ์–ด๋””์—์„œ ์ผ๊ด„์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฑธ ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ์•„์ด์ฝ˜ ๊ฐ„ ํ†ต์ผ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง์ ‘ ๊ทธ๋ฆฌ๊ธฐ๋กœ ํ–ˆ๋‹ค. ๋ฌผ๋ก , ๋„ˆ๋ฌด..

Nutri Capture ๋ฐฑ์—”๋“œ - StateFlow๋กœ ์ „ํ™˜

#1 ๊ฐœ์š”#1-1 State์—์„œ StateFlow๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ [Kotlin] Coroutines Flow - StateFlow#1 ๊ฐœ์š” StateFlowA SharedFlow that represents a read-only state with a single updatable data value that emits updates to the value to its collectors. A state flow is a hot flow because its active instance exists independently of the presence of collectokenel.tistory.com์œ„ ๊ฒŒ์‹œ๊ธ€์„ ์ฐธ์กฐํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ๋‹ค. #1-2 StateFlow ์—…๋ฐ์ดํŠธ์ด์ „ ๊ฒŒ์‹œ๊ธ€์˜ ๋ฌธ์ œ์ ์„ ..