dependencies {
def nav_version = "2.5.3"
implementation("androidx.navigation:navigation-compose:$nav_version")
}
enum class DotoringLoginScreen() {
Branch,
Login,
Register
}
NavController란?
NavController는 back stack과 각 스크린의 상태를 추적합니다.
NavController 생성
val navController = rememberNavController()
NavController는 하나의 NavHost와 연관되어 있어야 한다. NavHost는 NavController와 Navigation Graph를 연결하는 역할을 한다. 화면 전환을 하면서 NavHost 안의 내용은 자동적으로 recompose된다.
NavHost(
navController,
startDestination,
modifier,
) {
content
}
startDestination
: 앱이 처음 NavHost로 보여주는 화면을 가리키는 route이다.content
: NavController의 destination에 해당하는 모든 composable을 정의한다.NavHost의 content안에 다음의 내용을 작성한다.
composable(route) {
content
}
route
: route 이름을 나타내는 String. enum class에 정의해둔 내용을 활용한다.content
: 주어진 route에서 display하고자 하는 composable을 호출할 수 있다. NavHost(
navController = navController,
startDestination = DotoringLoginScreen.Branch.name,
modifier = modifier,
) {
composable(DotoringLoginScreen.Branch.name) { /*스크린 호출*/ }
composable(DotoringLoginScreen.Login.name) { /*스크린 호출*/ }
composable(DotoringLoginScreen.Registser.name) { /*스크린 호출*/ }
}
navigate(route)
를 통해 destination을 인자로 주어 원하는 화면으로 전환이 가능하다. 이 때, 화면 전환과 함께 back stack에 전환 전의 화면이 추가된다. 다음과 같이 사용한다.navController.navigate(DotoringLoginScreen.Login.name)
navigate()
메소드의 옵션들popUpTo(route)
launchSingleTop = true
navigate()
메소드를 어디에 작성해야 하는가
Single source of truth 원칙을 지키기 위해서, NavController를 hoist한 composable과 매개변수로 받는 composable이 navigation을 호출해야 한다. 하위 composable에서 발생한 navigation이벤트는 해당 이벤트를 호출자에게 노출해야 한다.
navigate()
메소드의 사용
@Composable
fun NavHost(
modifier: Modifier = Modifier,
navController: NavHostController = rememberNavController(),
startDestination: String = DotoringLoginScreen.Branch.name
) {
NavHost(
modifier = modifier,
navController = navController,
startDestination = startDestination
) {
composable(DotoringBranchScreen.Branch.name) {
BranchScreen(
onNavigateToLogin = { navController.navigate(DotoringLoginScreen.Login.name) },
/*...*/
)
}
composable(DotoringLoginScreen.Login.name) {
BranchScreen(
/*...*/
)
}
composable(DotoringRegisterScreen.Register.name) {
RegisterScreen(
/*...*/
)
}
}
}
@Composable
fun BranchScreen(
onNavigateToLogin: () -> Unit,
/*...*/
) {
/*...*/
Button(onClick = onNavigateToLogin) {
Text(text = "로그인 화면")
}
}
onClick
인자로 초기화.navigate()
메소드 호출navController.navigate(route)
navigate()
메소드가 호출되도록 한다.navigate()
함수 호출의 결과popBackStack()
메소드는 언제 사용할까?popBackStack()
메소드 syntaxnavController.popBackStack(route, inclusive)
route
: 돌아가고 싶은 화면의 routeinclusive
: Boolean값. true이면 특정한 route를 삭제, false이면 모든 destination을 pop하고 start destination으로 이동.onClick
인자로 넘김ACTION_SEND
인텐트로 데이터 sharing action을 만들어 낼 수 있다.Reference
잘 보고 가요~!👍