Kotlin DSL と Navigation Compose における型安全性

組み込みのタイプセーフ API を使用して、ナビゲーション グラフにコンパイル時の型安全性を提供できます。これらの API は、アプリで Navigation Compose または Navigation Kotlin DSL を使用している場合に使用できます。Navigation 2.8.0 時点でご利用いただけます。

これらの API は、XML を使用してビルドされたナビゲーション グラフに Safe Args が提供するものと同等です。

ルートを定義する

Compose で型安全なルートを使用するには、まず、ルートを表すシリアル化可能なクラスまたはオブジェクトを定義する必要があります。

シリアル化可能なオブジェクトを定義するには、Kotlin シリアル化プラグインで提供される @Serializable アノテーションを使用します。このプラグインをプロジェクトに追加するには、これらの依存関係を追加します。

ルートに使用するタイプを決定するには、次のルールを使用します。

  • オブジェクト: 引数のないルートにはオブジェクトを使用します。
  • クラス: 引数のあるルートにはクラスまたはデータクラスを使用します。
  • KClass<T>: パラメータのないクラスや、すべてのパラメータにデフォルト値があるクラスなど、引数を渡す必要がない場合に使用します。
    1. 例: Profile::class

いずれの場合も、オブジェクトまたはクラスはシリアル化可能である必要があります。

例:

// Define a home route that doesn't take any arguments
@Serializable
object Home

// Define a profile route that takes an ID
@Serializable
data class Profile(val id: String)

グラフを作成する

次に、ナビゲーション グラフを定義する必要があります。composable() 関数を使用して、ナビゲーション グラフ内でコンポーザブルをデスティネーションとして定義します。

NavHost(navController, startDestination = Home) {
     composable<Home> {
         HomeScreen(onNavigateToProfile = { id ->
             navController.navigate(Profile(id))
         })
     }
     composable<Profile> { backStackEntry ->
         val profile: Profile = backStackEntry.toRoute()
         ProfileScreen(profile.id)
     }
}

この例では、次の点に注意してください。

  • composable() は型パラメータを受け取ります。つまり、composable<Profile> のようになります。
  • 宛先タイプを定義することは、composable("profile") のように route 文字列を渡すよりも堅牢なアプローチです。
  • ルートクラスは、val id: String と同様に、各ナビゲーション引数の型を定義するため、NavArgument は必要ありません。
  • プロファイル ルートの場合、toRoute() 拡張メソッドは NavBackStackEntry とその引数から Profile オブジェクトを再作成します。

グラフの一般的な設計方法について詳しくは、ナビゲーション グラフを設計するをご覧ください。

最後に、navigate() 関数を使用して、ルートのインスタンスを渡すことで、コンポーザブルに移動できます。

navController.navigate(Profile(id = 123))

これにより、ユーザーはナビゲーション グラフ内の composable<Profile> デスティネーションに移動します。id などのナビゲーション引数は、NavBackStackEntry.toRoute を使用して Profile を再構築し、そのプロパティを読み取ることで取得できます。

参考情報