Android Jetpack Navigation with multi-module
사용 버전: Android Studio Koala 2024.1.1
그러다 만난 난관이 있는데요. 바로 Jetpack(잿팩) Navigation(내비게이션)입니다.
Navigation은 Fragment 간의 화면을 전환하는 데 도움을 주는 라이브러리입니다.
문제는 여기서 발생합니다.
제 앱이 이런 식으로 Modularization(모듈화)을 진행합니다.
:app -> :feature -> :ui
:app에 navigation.xml 파일을 두게 되면, :feature에서 :app을 보지 못해 navigate를 사용할 수 없게 됩니다.
반대로 이것을 :ui에 두게 되면, :ui는 :feature(피처)를 참조할 수 없어서 navigation.xml에 fragment(프레그먼트)를 참조할 수 없게 됩니다.
어떻게 해야 할까요?
저는 이렇게 해결했습니다.
Navigation Graph(그래프)를 Kotlin DSL로 전환합니다.
https://developer.android.com/guide/navigation/design/kotlin-dsl
안드로이드 Jetpack Navigation with multi-module을 알아보겠습니다.
현재 하나의 module(모듈)로 구성된 제 앱을 multi-module(멀티 모듈)로 변경하고 있습니다.그러다 만난 난관이 있는데요. 바로 Jetpack(잿팩) Navigation(내비게이션)입니다.
Navigation은 Fragment 간의 화면을 전환하는 데 도움을 주는 라이브러리입니다.
문제는 여기서 발생합니다.
제 앱이 이런 식으로 Modularization(모듈화)을 진행합니다.
:app -> :feature -> :ui
:app에 navigation.xml 파일을 두게 되면, :feature에서 :app을 보지 못해 navigate를 사용할 수 없게 됩니다.
반대로 이것을 :ui에 두게 되면, :ui는 :feature(피처)를 참조할 수 없어서 navigation.xml에 fragment(프레그먼트)를 참조할 수 없게 됩니다.
어떻게 해야 할까요?
저는 이렇게 해결했습니다.
Navigation Graph(그래프)를 Kotlin DSL로 전환합니다.
https://developer.android.com/guide/navigation/design/kotlin-dsl
그리고, navigation library는 Kotlin DSL에서 Type Safe Args를 사용할 수 있는 2.8.0-alpha08 이상으로 해줬습니다.
Navigation graph를 다음과 같이 설정해 줍니다.
이것을 MainActivity에서 호출해 줍니다.
Serializable은 :Model 모듈에 만들었습니다.
이러한 navigation.xml은 kotlin DSL로 변환하면,
이렇게 됩니다.
전체적인 구조는
:app, :features -> :model
:app -> :features
이런 식이 됩니다.
navigate는 동일합니다.
navController.navigate를 한 후, 위에서 정의한 Serializable을 넣어주면 됩니다.
또는
Safe Type을 받는 방법은 다음과 같습니다.
Fragment에서 toRoute를 이용합니다.
아직은 베타 버전이라 공식 문서에서도 방법을 찾기 힘드실 겁니다. 나중에 정식 버전이 출시 되면 참고할 만한 게 많으실 거예요.
끝.
카테고리: Android
댓글
댓글 쓰기
궁금한 점은 댓글 달아주세요.
Comment if you have any questions.