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

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

これらの API は、Safe Args がナビゲーション グラフに組み込まれているナビゲーション XML リソース ファイルに提供される機能と同じです。

ルートを定義する

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

  • Object: 引数のないルートにオブジェクトを使用します。
  • クラス: 引数を持つルートにはクラスまたはデータクラスを使用します。
  • 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 オブジェクトを再作成します。

グラフの一般的な設計方法について詳しくは、Navigation グラフを設計するのページをご覧ください。

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

navController.navigate(Profile(id = 123))

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

参考情報