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

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

interfacer_han 2024. 9. 26. 18:59

#1 ๊ฐœ์š”

#1-1 Scaffold์˜ bottomBar

 

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

#1 ๊ฐœ์š”#1-1 ์ฒซ ์‚ฝ ๋œจ๊ธฐ๋ฌด์—‡๋ถ€ํ„ฐ ์†์„ ๋Œ€์•ผํ•  ์ง€ ๊ฐ์ด ์žกํžˆ์ง€ ์•Š๋Š”๋‹ค. ํ”„๋กœํ† ํƒ€์ดํ•‘์„ ํ•œ๋ฒˆ ๋” ํ•ด์•ผ ํ•˜๋‚˜? ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋ธ๋ง์ด๋ผ๋Š” ๊ฑด ๋ญ์ง€... ์ด๊ฑธ ๋จผ์ € ๊ณต๋ถ€ํ•ด์•ผํ• ๊นŒ? ...  ์—ฌ๋Ÿฌ ์˜๋ฌธ์ด ๋“ ๋‹ค. ๊ทธ

kenel.tistory.com

์ด์ „ ๊ฒŒ์‹œ๊ธ€์—์„œ Scaffold๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ํ•ด๋‹น Scaffold์—๋Š” ๋Œ€๋ถ€๋ถ„ ์•ฑ์˜ ์ „ํ˜•์ ์ธ ๊ตฌ์กฐ๋กœ์„œ ํฌํ•จ๋˜๋Š” NavigationBar๋ฅผ ๋„ฃ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ ๋จผ์ €, NavHost๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด๋‘˜ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
 

#1-2 NavHost ๊ตฌํ˜„

 

[Android] Jetpack Compose - Navigation ๊ธฐ์ดˆ

#1 ๊ฐœ์š”#1-1 ์ „ํ†ต์ ์ธ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ์˜ Navigation [Android] Navigation - ๊ธฐ์ดˆ#1 ์ด์ „ ๊ธ€ [Android] Navigation - ํ™˜๊ฒฝ ์„ค์ • #1 Navigation#1-1 ์•กํ‹ฐ๋น„ํ‹ฐ ๋ฐ ํ”„๋ž˜๊ทธ๋จผํŠธ ๊ตฌ์„ฑ์˜ ํŠธ๋ Œ๋“œ์š”์ฆ˜ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ

kenel.tistory.com

์œ„ ๊ฒŒ์‹œ๊ธ€์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ #2์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.
 

#1-3 Destination ๊ตฌ์„ฑ

1. NutrientInputScreen: ์‚ฌ์šฉ์ž๊ฐ€ ๋จน์€ ์Œ์‹์— ๋Œ€ํ•ด ๊ธฐ๋กํ•˜๋Š” ํ™”๋ฉด
2. StatisticsScreen: ์ง€๊ธˆ๊นŒ์ง€ ๊ธฐ๋กํ•œ ์‹๋‹จ์— ๋Œ€ํ•œ ํ†ต๊ณ„ ํ™”๋ฉด
3. UserInfoScreen: ์‚ฌ์šฉ์ž ์ž์ฒด์— ๋Œ€ํ•œ ์ •๋ณด ํ™”๋ฉด

NavHost ๋ฐ NavigationBar๊ฐ€ ๋ณด์œ ํ•  Destination์„ 3๊ฐ€์ง€๋กœ ์ƒ์ •ํ–ˆ๋‹ค. ๋‚˜์ค‘์— ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์ง€๋งŒ, ํ˜„์žฌ ์‹œ์ ์—์„œ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒ๋˜๋Š” ํ™”๋ฉด์ด๋‹ค.
 

#2 ์ฝ”๋“œ

#2-1 ๋ชจ๋“ˆ ์ˆ˜์ค€ build.gradle.kt ๋ฐ lib.versions.toml ์ˆ˜์ •

plugins {
    ...
}

android {
    ...
}

dependencies {

    ...

    // Navigation
    implementation(libs.androidx.navigation.runtime.ktx)
    implementation(libs.androidx.navigation.compose)
}

Jetpack Compose์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

[versions]
...
navigationRuntimeKtx = "2.8.1"

[libraries]
...
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationRuntimeKtx" }
androidx-navigation-runtime-ktx = { module = "androidx.navigation:navigation-runtime-ktx", version.ref = "navigationRuntimeKtx" }

[plugins]
...

build.gradle์— ์ถ”๊ฐ€ํ–ˆ๋˜ ๊ตฌ๋ฌธ์„ ์•ˆ๋“œ๋กœ์ด๋“œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋„๋ก lib.versions.toml๋„ ์ˆ˜์ •ํ•œ๋‹ค.

 

#2-2 Destination์šฉ @Composable 3๊ฐœ ์ƒ์„ฑ

// in NutrientInputScreen.kt
@Composable
fun NutrientInputScreen(
    scope: CoroutineScope,
    snackbarHostState: SnackbarHostState
) {
    Column(
        modifier = Modifier.fillMaxSize()
    ) {
        SampleContent(
            text = "NutrientInputScreen",
            modifier = Modifier
                .fillMaxSize()
                .background(Color.LightGray),
            scope = scope,
            snackbarHostState = snackbarHostState
        )
    }
}

// in StatisticsScreen.kt
@Composable
fun StatisticsScreen(
    scope: CoroutineScope,
    snackbarHostState: SnackbarHostState
) {
    Column(
        modifier = Modifier.fillMaxSize()
    ) {
        SampleContent(
            text = "StatisticsScreen",
            modifier = Modifier
                .fillMaxSize()
                .background(Color.LightGray),
            scope = scope,
            snackbarHostState = snackbarHostState
        )
    }
}

// in UserInfoScreen.kt
@Composable
fun UserInfoScreen(
    scope: CoroutineScope,
    snackbarHostState: SnackbarHostState
) {
    Column(
        modifier = Modifier.fillMaxSize()
    ) {
        SampleContent(
            text = "UserInfoScreen",
            modifier = Modifier
                .fillMaxSize()
                .background(Color.LightGray),
            scope = scope,
            snackbarHostState = snackbarHostState
        )
    }
}

3๊ฐœ์˜ ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜๋ฅผ ๊ฐ๊ฐ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด๋‘์—ˆ๋‹ค. SampleContent()๋Š” MainActivity.kt์— ์ •์˜ํ•ด๋‘์—ˆ๋˜ ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜๋‹ค.
 

#2-3 NavHost ํด๋ž˜์Šค ๊ตฌํ˜„ ๋ฐ Scaffold์˜ content ์˜์—ญ์— ๋‘๊ธฐ

...

class MainActivity : ComponentActivity() {
    @OptIn(ExperimentalMaterial3Api::class)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            NutricapturenewTheme {
                // Navigation ๊ด€๋ฆฌ์˜ ์ฃผ์ฒด
                val navController = rememberNavController()

                // Snackbar๋ฅผ ์œ„ํ•œ CoroutineScope์™€ State
                val scope = rememberCoroutineScope()
                val snackbarHostState = remember { SnackbarHostState() }

                Scaffold(
                    ...
                ) { innerPadding ->
                    NavHost(
                        navController = navController,
                        startDestination = "nutrientInputScreen",
                        modifier = Modifier.padding(innerPadding)
                    ) {
                        composable(route = "nutrientInputScreen") {
                            NutrientInputScreen(
                                scope = scope,
                                snackbarHostState = snackbarHostState
                            )
                        }
                        composable(route = "statisticsScreen") {
                            StatisticsScreen(
                                scope = scope,
                                snackbarHostState = snackbarHostState
                            )
                        }
                        composable(route = "userInfoScreen") {
                            UserInfoScreen(
                                scope = scope,
                                snackbarHostState = snackbarHostState
                            )
                        }
                    }
                }
            }
        }
    }
}

@Composable
fun SampleContent( ... ) { ... }

content ์˜์—ญ์— ์žˆ๋˜ SampleContent()๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๊ทธ ๋Œ€์‹  NavHost()๋ฅผ ์œ„์น˜์‹œ์ผฐ๋‹ค. NavHost๊ฐ€ innerPadding์„ ๊ณ ๋ คํ•˜๊ฒŒ ๋‘์—ˆ๊ณ , 3๊ฐœ์˜ Destination์— ๊ฐ๊ฐ์— CoroutineScope ๋ฐ SnackbarHostState๋ฅผ ์ „๋‹ฌ(์ƒ์„ฑ์ž ์ฃผ์ž…)ํ•œ๋‹ค.
 

#3 ์š”์•ฝ

Destination์šฉ ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜๋ฅผ 3๊ฐœ์™€ NavHost๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
 

#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