본문 바로가기
Android

navHostController vs navController

by 너츠너츠 2023. 9. 20.

배경

Compose를 개발하다보면 Navigation을 구현할 때 NavController와 NavHostController를 혼용해서 사용하기도 합니다.

 

NavController

NavController는 NavHost 내부에서 app navigation을 관리합니다.

여기서 NavHost를 확인해보면 interface로 내부에 NavController를 가지고 있는 것을 볼 수 있습니다.

코드와 같이 주석도 확인해보면 NavController와 NavHostController가 같이 설명되고 있는 것을 볼 수 있습니다.

A host is a single context or container for navigation via a NavController.

host는 NavController를 통한 탐색을 위한 단일 컨텍스트 또는 컨테이너입니다.

It is strongly recommended to construct the nav controller by instantiating a NavHostController, which offers additional APIs specifically for a NavHost. The NavHostController should still only be externally accessible as a NavController, rather than directly exposing it as a NavHostController.

NavHostController를 인스턴스화하여 NavHostController를 구성하는 것이 좋습니다. NavHostController는 NavHostController로 직접 노출되지 않고 외부에서 NavController로만 액세스할 수 있어야 합니다.

즉 NavController를 직접사용할 수는 있지만, 하위 구현체는 NavHostController를 통해 액새스하는 것이 좋다고 설명합니다.

 

NavHostController

그래서 인지 NavHostController 주석에는 다음과 같이 정리되어있습니다.

Subclass of NavController that offers additional APIs for use by a NavHost to connect the NavController to external dependencies.

NavHost에서 NavController를 외부 종속성에 연결하기 위해 사용할 수 있는 추가 API를 제공하는 NavController의 하위 클래스입니다.

Apps should generally not construct controllers, instead obtain a relevant controller directly from a navigation host via NavHost.getNavController or by using one of the utility methods on the Navigation class.

앱은 일반적으로 컨트롤러를 구성해서는 안 되며 NavHost.getNavController를 통해 또는 NavGavigation 클래스의 유틸리티 메소드 중 하나를 사용하여 내비게이션 호스트에서 직접 관련 컨트롤러를 얻어야 합니다.

 

저희가 사용하는 대부분의 기능들은 NavController에 포함되어 있고 NavHostController 4가지 함수만 override하는 형태입니다.

  • setLifecycleOwner
  • setOnBackPressedDispatcher
  • enabledOnBackPressed
  • setViewModelStore

 

결론

NavController는 내부에서 사용하기 위한 Navigation의 대부분 동작을 명시해놓은 class이며, 개발자가 이 코드에 직접적으로 접근하는 것을 방지하기 위해 NavHostController를 통해 접근하도록 한 것이라는 생각이 들었습니다. 

반응형

댓글