네비게이션 라이브러리

woniwon·2024년 3월 18일
0

Android

목록 보기
14/19
post-thumbnail

네비게이션 라이브러리

네비게이션 라이브러리의 주요 기능

  • 단일 활동 아키텍처(Single Activity architecture) 지원: 모던 안드로이드 개발에서 권장되는 방식으로, 하나의 Activity가 여러 Fragment를 호스트하는 구조를 쉽게 구현할 수 있게 해준다.
  • 안전한 인자 전달: 타입 안전성을 보장하는 방식으로 화면 간의 데이터를 전달할 수 있다.
  • 애니메이션 및 전환 지원: 화면 전환 시 사용자 정의 애니메이션을 쉽게 추가할 수 있다.
  • 딥링크 지원: URL을 통해 앱의 특정 화면으로 바로 접근할 수 있게 해준다.
  • 앱바 및 네비게이션 드로어와의 통합: 네비게이션과 앱의 상단 바나 네비게이션 드로어를 자동으로 연동할 수 있다.
  • 조건부 네비게이션: 사용자의 상태나 설정에 따라 다른 화면으로 이동하도록 설정할 수 있다.
  • 이 컴포저블은 네비게이션 그래프를 담고 있으며, 앱의 다양한 화면(컴포저블) 사이의 이동을 관리한다.
  • NavHost는 네비게이션 라이브러리의 일부이며, NavController와 함께 작동하여 화면 전환, 데이터 전달, 백 스택 관리 등의 기능을 수행한다.
  • 네비게이션 그래프(Navigation Graph): 앱의 네비게이션 구조를 정의하는 XML 파일이나 코드로 구성된 집합으로 네비게이션 그래프는 앱의 다양한 목적지(Destination)와 이 목적지들 사이의 액션(Action)으로 구성된다.
  • 목적지(Destination): 네비게이션 그래프 내의 화면이나 뷰를 의미한다. Compose에서는 컴포저블 함수가 목적지가 될 수 있다.
  • 액션(Action): 목적지 사이의 이동을 정의하는 요소 액션을 통해 목적지로 이동하거나 데이터를 전달하고, 특정 조건에서의 네비게이션 행위를 정의한다.
import androidx.compose.runtime.Composable
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
import androidx.navigation.compose.composable

@Composable
fun MyApp() {
    // NavController 인스턴스 생성
    val navController = rememberNavController()

    // NavHost 선언
    NavHost(navController = navController, startDestination = "home") {
        // "home" 목적지(HomeScreen 컴포저블)을 네비게이션 그래프에 추가
        composable("home") { HomeScreen(navController) }

        // "detail" 목적지(DetailScreen 컴포저블)를 네비게이션 그래프에 추가
        // 여기서 "itemId"는 DetailScreen으로 넘겨주는 인자
        composable("detail/{itemId}"
           ,arguments = listOf(navArgument("id") { type = NavType.IntType }) {
            backStackEntry ->
            // 인자로 전달받은 itemId 사용
            val itemId = backStackEntry.arguments?.getString("itemId")
            DetailScreen(itemId)
        }
    }
}

@Composable
fun HomeScreen(navController: NavController) {
    // 화면 구성 및 "detail" 목적지로 네비게이션 하는 버튼 등을 포함
}

@Composable
fun DetailScreen(itemId: String?) {
    // 화면 구성
}
  • 위 예시에서 NavHostrememberNavController를 통해 생성된 navController 인스턴스를 사용하여 네비게이션을 관리한다.
  • startDestination은 네비게이션 그래프에서 시작하는 첫 화면의 라우트를 지정한다.
  • composable 함수를 통해 각 목적지(여기서는 컴포저블 함수)를 네비게이션 그래프에 추가한다.
  • backStackEntry.arguments를 사용하여 다른 화면에서 전달받은 인자를 사용할 수 있다.
  • 핵심 탐색 API로, 사용자가 방문한 대상을 추적하고 사용자가 목적지 간에 이동할 수 있도록 허용
  • 컴포저블 계층 구조에서, 상위에 NavController()를 호출해야함 → 모든 컴포저블이 참조 가능
val navController = rememberNavController()

BackStack

  • 사용자가 앱 전체에서 화면간 이동할 때, NavController는 대상을 BackStack에 추가하거나 삭제
  • 후입선출 구조로, 스택 상단으로 Push하고, 스택 상단에서 항목을 pop 한다.
  • 기본 동작
    • 첫번째 대상 : 사용자가 앱을 열면 NavController는 첫 번째 대상을 백 스택의 맨 위로 푸시
    • 스택으로 푸시 :  호출 NavController.navigate()는 지정된 대상을 스택 상단으로 푸시
    • 최상단 대상 팝하기 :  또는 뒤로를 탭하면 NavController.navigateUp() , NavController.popBackStack() 메서드가각각 호출되어 스택에서 최상단 대상을 팝한다.
  • 기본 돌아가기
    • NavController.popBackStack()은 현재 대상을 백 스택에서 팝하고 이전 대상으로 이동한다.
    • 성공 여부를 불리언 값으로 반환
  • 특정 대상으로 돌아가기
    • 특정 대상으로 돌아가기 위해서는 popBackStack()의 오버로드를 사용한다.
    • 정수 id 또는 문자열 route를 식별자로 전달 가능
      • inclusive 불리언은 지정된 대상으로 이동한 뒤에 이를 백스택에서 팝해야하는지 결정

        navController.popBackStack(R.id.destinationId, true)

         → NavController는 정수 ID가 destinationId인 대상으로 다시 돌아갑니다. inclusive 인수 값이 true이므로 NavController는 지정된 대상을 백 스택에서 팝

  • BackStack 실패한 경우
    • popBackStack()false를 반환하면 NavController.getCurrentDestination() 호출에서 null이 반환될 수 있다. 이 경우 사용자에게 빈 화면이 표시
      • 예시:
        if (!navController.popBackStack()) {
            finish()
        }
  • 대상으로 팝업
    • 백 스택에서 특정 대상을 팝하려면 navigate() 함수 호출에 popUpTo() 인수를 추가한다.
      • inclusive 매개변수는 지정된 대상도 백 스택에서 팝할지 결정
        • Compose 예:
          navController.navigate("destination_b") {
              popUpTo("destination_a") {
                  inclusive = true
                  saveState = true
              }
          }
  • 상태 저장 및 복원
    • popUpTo를 사용하여 대상으로 이동할 때 백 스택에서 팝된 모든 대상의 상태를 저장할 수 있다.
    • 대상으로 이동할 때 restoreSaveStatetrue로 정의하여 연결된 상태를 자동으로 복원할 수 있다.
profile
단순 기록용 Velog 입니다.

0개의 댓글