ユーザ用ツール

サイト用ツール


サイドバー

プログレス合同会社

広告

android:studio:application:app:navigation-module

05.ナビゲーションモジュールの作成

画面遷移を一元管理するためナビゲーションモジュールを作成します。

Compose Navigationの導入

ナビゲーション(画面遷移)は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]

3行目
コメント部分のURLを参照して、最新安定バージョンを指定します。
7行目
Compose Navigationの依存ライブラリを定義しています。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

uiモジュールの作成と同様に、トップディレクトリで:core:navigationを作成し、javaディレクトリ名の変更、および、サンプルテストクラスの削除を行います。

LibraryConfigurePluginの適用

モジュールのbuild.gradle.ktsLibraryConfigurePluginを適用します。

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)
}

2行目~3行目、10行目~25行目、18行目~33行目、41行目~43行目
ビルドプラグインで定義しているので削除します。
4行目
/build-logic/build.gradle.ktsで定義したビルドプラグインのidを指定します。
5行目、34行目~36行目、47行目
Compose Navigationを使用しますので追記します。
17行目、44行目~46行目
:core:navigationモジュールではテストを行わないため削除します。

適用後、『同期アイコン』で内容をプロジェクトに反映させます。

ナビゲーションのコンテナ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() }
    }
  }
}

11行目~13行目
UIツリー内にNavHostControllerのローカルな変数を確保して、そのキーをLocalNavControllerに取得します。
17行目
NavGraphBuilderで登録されたNavGraphの一覧を受け取ります。
各画面は自分でNavGraphBuilderを使ってNavGraphを登録します。
20行目~21行目
LocalNavControllerNavControllerを提供します。
スコープ内ではLocalNavControllerをキーとしてNavControllerにアクセスできます。
NavGraphNavControllerを引数として渡す必要がなくなります。
22行目~27行目
NavHostを定義しています。
26行目
NavGraphの一覧からNavGraphNavHostに登録しています。

各画面が自分でNavGraphBuilderを使ってNavGraphを登録しますので、画面が増えてもNavHostNavGraphを登録する処理を変更する必要はありません

android/studio/application/app/navigation-module.txt · 最終更新: by プログレス合同会社