-
Notifications
You must be signed in to change notification settings - Fork 1
Compose_Navigation
Android Developers Compose๋ฅผ ์ด์ฉํ ํ์ | JetPack Compose | Android Developers
Android Developers JetPack Compose Navigation
Compose Navigation์ ์ ์ฉํ๋ ๋จ๊ณ๋ ์๋์ ๊ฐ๋ค.
- NavController ๋ง๋ค๊ธฐ
- ํ์ ๊ทธ๋ํ ์ค๊ณ
- ์ปดํฌ์ ๋ธ๋ก ์ด๋
NavController๋ ์ค์ ํ์ API์ด๋ค.
์ฌ์ฉ์๊ฐ ๋ฐฉ๋ฌธํ ๋์์ ์ถ์ ํ๊ณ ์ฌ์ฉ์๊ฐ ๋ชฉ์ ์ง ๊ฐ์ ์ด๋ํ ์ ์๋๋ก ํ๋ค.
Compose์์ NavController๋ฅผ ๋ง๋๋ ค๋ฉด rememberNavController()
๋ฅผ ํธ์ถํด์ผ ํ๋ค.
์ด NavController๋ ์ปดํฌ์ ๋ธ ๊ณ์ธต ๊ตฌ์กฐ์์ ์ฐธ์กฐํด์ผ ํ๋ ๋ชจ๋ ์ปดํฌ์ ๋ธ์ด ์ด๋ฅผ ์คํํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ๋์ด ์์ด์ผ ํ๋ค.
Compose์์๋ ์ง๋ ฌํ ๊ฐ๋ฅํ ๊ฐ์ฒด ๋๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ค.
๋ฃจํธ ๋ชฉ์ ์ง์ ๋์ฐฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ณ , ๋ชฉ์ ์ง์ ๋์ฐฉํ๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ผ๋ฉฐ, ๋ชฉ์ ์ง์ ๋๋ฌํ ์ ์๋ค.
์์ ์ฝ๋
@Serializable
object Profile
@Serializable
object FriendsList
val navController = rememberNavController()
NavHost(navController = navController, startDestination = Profile) {
composable<Profile> { ProfileScreen( /* ... */ ) }
composable<FriendsList> { FriendsListScreen( /* ... */ ) }
// Add more destinations similarly.
}
์ ์์์์๋ ์ด๋ํ ์ปดํฌ์ ๋ธ ๊ฒฝ๋ก๋ฅผ Profile
FriendsList
์ ์ํ๋ค.
๋ํ ์ด๋ฅผ ์ง๋ ฌํ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ก ๋ง๋ค์๋ค.
NavHost
์ธ์์์๋ ๊ธฐ์กด์ ๋ง๋ค์๋ NavController๋ฅผ ์ฐ๊ฒฐํ๊ณ ์์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค.
HavHost
์ฝ๋ฐฑ์๋ ๊ฐ ๊ฒฝ๋ก์ ์ ๋ณด๋ฅผ ์
๋ ฅํ๋ค.
๊ฐ NavHost
์ ์ ๋ฌ๋ ๋๋ค๋ ๊ถ๊ตญ์ ์ผ๋ก HavController.createGraph()
๋ฅผ ํธ์ถํ๊ณ NavGraph
๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ค.
์์ ๋์์ ์ค์ ๋ก ์๋์ ๋์๊ณผ ๋์ผํ๋ค.
val navGraph by remember(navController) {
navController.createGraph(startDestination = Profile)) {
composable<Profile> { ProfileScreen( /* ... */ ) }
composable<FriendsList> { FriendsListScreen( /* ... */ ) }
}
}
NavHost(navController, navGraph)
์ธ์ ์ ๋ฌ์ด ํ์ํ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ ๋ฌํ ์ ์๋ค.
๊ธฐ์กด์ ๋๋ค์ Composable์ ์๋์ ๊ฐ์๋ค.
composable(Profile) { ProfileScreen( /* ... */ ) }
์ฌ๊ธฐ์ Composable์ ์ธ์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ค์ผํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก composable
๋ชจ๋ ์ธ์๋ ๋ฌธ์์ด๋ก ํ์ฑ๋๋ค.
์ธ์๋ก ์ ๋ฌํ๊ณ ์ถ์ ๊ฐ์ ์ด ๋ฌธ์์ด ๋ท ๋ถ๋ถ์ ์ถ๊ฐํ๋ฉด ๋๋ค.
์ฆ, ๋ง์ฝ Id
๊ฐ์ ๋๊ฒจ์ฃผ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉํด์ผ ํ๋ค.
composable("Profile/{userId}") { ProfileScreen( /* ... */ ) }
์ด ์ ๋ฌ ๋ฐ๋ Id๊ฐ์ NavBackStackEntry
์์ ์ถ์ถํด์ผ ํ๋ค.
composable("profile/{userId}") { backStackEntry ->
Profile(navController, backStackEntry.arguments?.getString("userId"))
}
์ปดํฌ์ ๋ธ๋ก ์ด๋์ ๊ฐ๋จํ๋ค.
NavController.navigate<T>
๋ง ํธ์ถํ๋ฉด ๋์ด๋ค!
@Serializable
object FriendsList
navController.navigate(route = FriendsList)
๊ตฌ์ฑ ๊ฐ๋ฅํ ํจ์๊ฐ ์ ํ๋ฉด์ผ๋ก ์ด๋ํด์ผ ํ๋ ๊ฒฝ์ฐ navigate()
์ง์ ํธ์ถํ๋๋ก NavController
์ฐธ์กฐ๋ฅผ ์ง์ ์ ๋ฌํ๋ฉด ์๋๋ค.ย
UDF(๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ) ์์น์ ๋ฐ๋ผ NavController
๊ฐ ์ฒ๋ฆฌํ๋ navigate
์ด๋ฒคํธ๋ฅผ ๋
ธ์ถํด์ผ ํ๋ค.
@Serializable
object FriendsList
navController.navigate(route = FriendsList, navController)
์ฆ, ์์ ์ฒ๋ผ navController ์ฐธ์กฐ๋ฅผ ์ง์ ์ ๋ฌํ์ฌ FriendsList
์ปดํฌ์ ๋ธ ๋ด์์ ์ฌ์ฉํ๋ฉด ์๋๋ค๋ ๋ป์ด๋ค.
composable<Profile> {
ProfileScreen(
onNavigateToFriends = { navController.navigate(route = FriendsList) },
/*...*/
)
}
์์ ๊ฐ์ด navController.navigate
์ด๋ฒคํธ๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.
์ข ๋ ์ฝ๊ฒ ๋งํ๋ฉด ์ปดํฌ์ ๋ธ์์ () -> Unit
์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํด์ผ ํ๋ค๋ ๋ป์ด๋ค.
๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
1์ฃผ์ฐจ
2์ฃผ์ฐจ
3์ฃผ์ฐจ
4์ฃผ์ฐจ
5์ฃผ์ฐจ
ํ์๋ก
1์ฃผ์ฐจ
2์ฃผ์ฐจ
3์ฃผ์ฐจ
4์ฃผ์ฐจ
5์ฃผ์ฐจ