Compose Navigationを用いてナビゲーション(画面遷移)を行います。
各:featureモジュールとの画面遷移は、navControllerを各画面に渡すことで、:appモジュールが各:featureの窓口モジュールを依存するだけで済むようになります。
※各:featureモジュールは:appモジュールを知らなくてもよい。
それにより循環依存がおきないため、:appモジュールにnavControllerを置くことにします。
循環依存が起きそうな場合は、core:navigationのような共通モジュールにnavControllerを置いて、:appモジュールや各:featureモジュールが、共通モジュールを依存することにより、循環依存が起きないようにします。
画面遷移を実装するため、Compose Navigationを導入します。
バージョンカタログにCompose Navigationの情報を追記します。
[versions]
:
navigation = "2.9.5" # https://mvnrepository.com/artifact/androidx.navigation/navigation-compose
[libraries]
:
navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigation" }
[plugins]
追記後、『Sync Now』で内容をプロジェクトに反映させます。
:appモジュールのbuild.gradle.ktsにCompose Navigationを適用します。
:
dependencies {
:
implementation(libs.navigation.compose)
:
}
適用後、『同期アイコン』で内容をプロジェクトに反映させます。
Navigationロジックを作成します。
:appモジュールのnavigationディレクトリ(新規に作成します)内にAppNavigation.ktを作成します。
package jp.co.progress_llc.portal.core.navigation
import androidx.compose.runtime.Composable
import androidx.navigation.NavHostController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.NavHost
@Composable
fun AppNavigation(
navController: NavHostController,
startDestination: String,
builders: List<NavGraphBuilder.() -> Unit>
) {
NavHost(
navController = navController,
startDestination = startDestination
) {
builders.forEach { it() }
}
}