compose์์ navigation์ ์ฌ์ฉํ ๋, ํ๋ฉด ์ ํ ์ ๋ณํ๋ ํ๋ฉด์ ๊ธฐ์กด์ ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ด ๋์๋ Navcontroller.navigate()์๋ค๊ฐ ๋๊ธธ ๋ฐ์ดํฐ๋ฅผ param์ผ๋ก ๋ฃ์ ๋ค์์ NavHost์์ composable()๋ก navigate logic์ ์์ฑํ๋ฉด ๋์๋ค.
navigation ์ค ๋ฐ์ดํฐ ์ ๋ฌ์ ๊ดํ ์์ธํ ์ค๋ช ์ ์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๋ฏํ๋ค.
https://rkdrkd-history.tistory.com/51
[Android, Kotlin] Compose UI ์ ๋ฆฌ(7)
์ด์ ํฌ์คํ https://rkdrkd-history.tistory.com/50 [Android, Kotlin] Compose UI ์ ๋ฆฌ(6) ์ด๋ฒ ํฌ์คํ ์์๋ compose ui๋ก bottom navigation์ ๋ง๋๋ ์์ ๋ฅผ ์ ๋ฆฌํด ๋ณผ ๊ฒ์ด๋ค. ์ด์ ํฌ์คํ https://rkdrkd-history.tistory.com/46 [
rkdrkd-history.tistory.com
ํ์ง๋ง ์ง๋ ํฌ์คํ ์์ ์ค๋ช ํ ๊ฒ์ ๊ธฐ๋ณธ ์๋ฃํ์ธ ๊ฒฝ์ฐ(string, int ๋ฑ๋ฑ...)์ argument๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ๋ง ์์๋ดค์๋ค.
์ด๋ฒ์ ํ ์ด ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ data class type์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ฒจ์ ๋์ค์๋ ๊น๋จน์ง ์๊ฒ ํฌ์คํ ์ ์์ฑํด ๋ณด์๋ค.
์ก๋ด์ ์ฌ๊ธฐ๊น์ง ํ๊ณ ๋ฐ๋ก ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์
1. naivgate ์ฐ๊ฒฐํ๊ธฐ
์ผ๋จ ๋จผ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ screen๊ณผ ๋ฐ์ screen ๊ฐ์ navigation์ ์ฐ๊ฒฐํด ์ค์ผ ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ฐ์ screen์ ๋ง๋ค์ด ๋ณด์
@Composable
fun ProfileScreen(
navigateToMain: () -> Unit
) {
. . .
}
๋์ค์ profileScreen์ parameter์ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์์ ์ด๋ค.
๊ทธ๋ค์ profileScreen์ route๋ฅผ ์์ฑํ๊ณ , navigate ๋ก์ง์ ์์ฑํ๋ค.
const val profileRoute = "profile"
fun NavController.navigateToProfile() {
this.navigate(profileRoute)
}
๋ค์์ผ๋ก NavHost์ profileScreen์ ์ถ๊ฐํด ์ฃผ๋ฉด profileScreen์์ ํ ์์ ์ ๋๋๋ค.
fun NavGraphBuilder.profileScreen(
navigateToMain: () -> Unit
) {
composable(profileRoute) {
ProfileScreen(navigateToMain = navigateToMain)
}
}
navigateToMain์ main๊ณผ profile screen ๊ฐ์ ํ๋ฉด ์ ํ์ ์ํด ์ถ๊ฐํด ๋์๋ค.
์ด์ mainScreen์์ ํด์ผ ํ ์์ ์ผ๋ก ๋์ด๊ฐ ๋ณด์.
profileScreen์์ ์์ ํ ๊ฒ์ฒ๋ผ ๋๊ฐ์ด ํด์ฃผ๋ฉด ์๋ก navigate ํ๋ ํ๋ฉด์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
์ฝ๋๋ฅผ ๋บ ๊ฒ์ ์ ๋ ๊ท์ฐฎ์์๊ฐ ์๋๋ค!
2. ๋ฐ์ดํฐ ๋๊ธฐ๋ ๋ก์ง ์์ฑํ๊ธฐ
main screen์ navigateProfile param์ ์์ฑํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์์ฑํด ์ฃผ๊ณ card์ onclick์ navigateToProfile์ ์ฐ๊ฒฐํด ์ค๋ค.
๋ฐ์ดํฐ ์์ฑ์ ์์๋ก ๋ง๋ค์ด๋, api๋ฅผ ํธ์ถํ๊ณ response ๊ฐ์ผ๋ก ํด์ค๋ ์๊ด์๋ค. ๋ฌผ๋ก card๋ ๊ผญ card๊ฐ ์๋์ด๋ ๋๋ค!!(clickable ํ ๋ชจ๋ compos function์์ ๊ฐ๋ฅํ๋ค.)
@Composable
fun MainScreen(
navigateToProfile: (teamData: UserDomain, userData: UserDataDomain) -> Unit
) {
// set send data
Card(onClick = navigateToProfile(teamData, userData)) {
}
}
๋ค์์ผ๋ก ์ด์ ์ ์์ฑํ navigateToProfile๋ก ์ด๋ํด mainscreen์์ ์ถ๊ฐํ navigateToProfile()๋ก ์ด๋ํด parameter๋ฅผ ์ถ๊ฐํ๊ณ route๋ฅผ ์์ ํด ์ฃผ๋๋ก ํ๊ฒ ๋ค.
route๋ ๋ฐ์ paramter๋ค ๋ชจ๋ ๋ฃ์ด์ค์ผ ํ๋ค. ์๋ฅผ ๋ค์ด dataClass.data ์ด๋ฐ ํ์์ผ๋ก ๋ฃ์ผ๋ฉด ์ค๋ฅ๊ฐ ๋๋๊น ์ฐธ๊ณ ํ๋๋ก ํ์.
fun NavController.navigateToProfile(teamDataJson: String, userDataJson: String) {
this.navigate("$profileRoute/$teamDataJson/$userDataJson")
}
์์ ์ฝ๋์์ ์ด์ํ ์ ์ด ์์ ๊ฒ์ด๋ค.
๋ฐ๋ก navigateToProfile์ด string์ด๋ผ๋ ์ ์ธ๋ฐ ๋ค์ ์ฝ๋์์ ์ ๊ทธ๋ฐ์ง ์ด์ ๋ฅผ ์๋ ค์ฃผ๊ฒ ๋ค.
NavHost์ mainScreen์ ์ถ๊ฐํ ๋ถ๋ถ์ผ๋ก ์ด๋ํ๋ค.
NavHost(
navController = navHostController,
startDestination = BottomNavItem.Main.route
) {
mainScreen(
navigateToProfile = { teamData, userData ->
val teamJson = Uri.encode(Gson().toJson(teamData))
val userJson = Uri.encode(Gson().toJson(userData))
navHostController.navigateToProfile(teamJson, userJson)
}
)
}
์ด์ ์ผ ๋งํ๋ ๊ฑฐ์ง๋ง ํ์๋ ์ ๋ฌํ data class๋ฅผ json string์ผ๋ก ๋ณํํ๊ณ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋, json string์ data class๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
๊ทธ๋์ navigateToProfile์์ string์ param์ผ๋ก ๋ฐ์ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ตณ์ด json string์ผ๋ก ๋ฐ๊พผ ์ด์ ๋ ํ์๋ data class ์ค url์ ๋ฐ๋ data๊ฐ ์์๋๋ฐ ์๊ธ์์ ๋งํ ๊ฒ์ฒ๋ผ route๋ฅผ ๋ฐ๊ฟ ๋, ๋ฐ์ param ํต์งธ๋ก ๋ฃ์ด์ค์ผ ํ๋๋ฐ url์ route๋ก ๋ณํํ๋ ๊ณผ์ ์์ encoading ๊ด๋ จ์ผ๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค.(๊ทธ ์ค๋ฅ ๋๋ฌธ์ 4์๊ฐ์ ๋ ๋ ธ๋ค ใ ) ๊ทธ๋์ json string์ผ๋ก ํ๋ ์์ด๋์ด๋ฅผ ์๊ฐํ๊ฒ ๋์๋ค. string์ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค!
์ค๋ช ์ด ๊ธธ์๋ค. ๋ค์ ์ฝ๋๋ก ๋์๊ฐ์
์ ๋ฌ๋ฐ์ data๋ฅผ ์จ๋จน๊ธฐ ์ํด navHost์ ์ถ๊ฐํ profileScreen์ผ๋ก ์ด๋ํ์.
fun NavGraphBuilder.profileScreen(navigateToStella: () -> Unit) {
composable(
route = "$profileRoute/{teamData}/{userData}",
arguments = listOf(
navArgument("teamData") { type = NavType.StringType },
navArgument("userData") { type = NavType.StringType }
)
) { navBackStackEntry ->
val teamDataJson = navBackStackEntry.arguments?.getString("teamData")
val teamData = Gson().fromJson(teamDataJson, UserDomain::class.java)
val userDataJson = navBackStackEntry.arguments?.getString("userData")
val userData = Gson().fromJson(userDataJson, UserDataDomain::class.java)
ProfileScreen(
teamData = teamData,
userData = userData,
navigateToStella = navigateToStella
)
}
}
route์๋ navigateToProfile์์ ์์ ํ๋ route ํ์์ ๊ทธ๋๋ ์จ์ค๋ค.
arguments์๋ route์ ์ง์ ํ name์ list๋ก ๋ฐ์ stringType๋ก ์ ์ฉํด ์ค๋ค.
๊ทธ ์ดํ composable์ navBackStackEntry๋ฅผ ์ด์ฉํด ์ง์ ํ name๋ค์ ๋ถ๋ฌ์ ๋ค์ data class type์ผ๋ก ๋ณํํด ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ profileScreen์ param์ผ๋ก ๋ฃ์ด ์ฃผ๋ฉด ์์ ์๋ฃ์ด๋ค.
์ ๋ฆฌ
์์ ์ ์ ๊น ๋ฐฐ์๋ณธ ์ง์์ ๊ฒ์ํ๋ฉด์ ๋ค์ ๊ณต๋ถํด ๋ณด์๋๋ฐ, ์์ ๊ธฐ์ต์ด ์๊ธฐ๋์ด์ ๊ณต๋ถํ๊ธฐ ํธํ์๋ค.
์ค๋ฅ ๋๊ธฐ ์ ์ ์ด ์๊ฐ์ ๋จผ์ ํ์ผ๋ฉด ํ๋ ํํ๋ ๋ค์๋ ๊ฒ ๊ฐ๋ค.
๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ์์๋ data class๋ฅผ ๋๊ฒจ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ํ๋คํ ๊ฒ ๊ฐ์๋ฐ ๊ทธ ์ฌ๋๋ค์์ ์ด ํฌ์คํ ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ๋ค.
์ง๋ฌธ ํ์ํฉ๋๋ค.
์ฝ๋๊ฐ ์๋ชป๋์๊ฑฐ๋ ๋ ํจ์จ์ด ์ข์ ์ฝ๋๋ฅผ ์๊ณ ๊ณ์ ๋ถ๋ค์ ๋๊ธ ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
'๐ฑ| Android > ๐ | Jetpack' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android, Kotlin] compose๋ก custom checkbox ๋ง๋ค๊ธฐ (0) | 2023.08.18 |
---|---|
[Android, Kotlin] compose๋ก tablayout ๊ตฌํํ๊ธฐ (2) | 2023.08.15 |
[Android, Kotlin] compose์์ api ํต์ ํ๊ธฐ (2) | 2023.08.03 |
[Android, Kotlin] Compose UI ์ ๋ฆฌ(7) (2) | 2023.04.16 |
[Android, Kotlin] Compose UI ์ ๋ฆฌ(6) (0) | 2023.04.07 |