画面遷移を一元管理するためナビゲーションモジュールを作成します。
ナビゲーション(画面遷移)は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』で内容をプロジェクトに反映させます。
uiモジュールの作成と同様に、トップディレクトリで:core:navigationを作成し、javaディレクトリ名の変更、および、サンプルテストクラスの削除を行います。
モジュールのbuild.gradle.ktsにLibraryConfigurePluginを適用します。
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
id("build.logic.library.configure")
id("org.jetbrains.kotlin.plugin.compose")
}
android {
namespace = "jp.co.progress_llc.portal.core.navigation"
compileSdk {
version = release(36)
}
defaultConfig {
minSdk = 28
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
buildFeatures {
compose = true
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
implementation(libs.navigation.compose)
}
適用後、『同期アイコン』で内容をプロジェクトに反映させます。
ナビゲーションのコンテナNavHostを作成します。
ファイル名をAppNavHost.ktにしています。
package jp.co.progress_llc.portal.core.navigation
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.navigation.NavHostController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
val LocalNavController = staticCompositionLocalOf<NavHostController> {
error("No NavController provided")
}
@Composable
fun AppNavHost(
navGraphs: List<NavGraphBuilder.() -> Unit>,
startDestination: String
) {
val navController = rememberNavController()
CompositionLocalProvider(LocalNavController provides navController) {
NavHost(
navController = navController,
startDestination = startDestination
) {
navGraphs.forEach { it() }
}
}
}
各画面が自分でNavGraphBuilderを使ってNavGraphを登録しますので、画面が増えてもNavHostにNavGraphを登録する処理を変更する必要はありません。