배경
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를 통해 접근하도록 한 것이라는 생각이 들었습니다.
반응형
'Android' 카테고리의 다른 글
[Android-Test] Android Test코드 작성하기2 - Espresso (0) | 2023.09.25 |
---|---|
[Android-Test] Android Test코드 작성하기1 - JUnit (0) | 2023.09.24 |
[Android] Compose랑 Hot Stream은 어울릴까? (0) | 2023.09.19 |
[Android] Multi-Module 구조에서 Navigation을 구현하자 (with DeepLink) (0) | 2023.09.19 |
[Android] 'excludes' is deprecated (0) | 2023.09.19 |
댓글