組み込みの型安全性 API を使用すると、コンパイル時の型安全性をナビゲーション グラフに提供できます。これらの API は、アプリで Navigation Compose または Navigation Kotlin DSL を使用している場合に利用できます。Navigation
2.8.0
からご利用いただけます。
これらの API は、Safe Args がナビゲーション グラフに組み込まれているナビゲーション XML リソース ファイルに提供される機能と同じです。
ルートを定義する
Compose でタイプセーフなルートを使用するには、まず、ルートを表すシリアル化可能なクラスまたはオブジェクトを定義する必要があります。
- Object: 引数のないルートにオブジェクトを使用します。
- クラス: 引数を持つルートにはクラスまたはデータクラスを使用します。
KClass<T>
: パラメータのないクラスや、すべてのパラメータがデフォルト値を持つクラスなど、引数を渡す必要がない場合に使用します。- 例:
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
を再構築し、そのプロパティを読み取ることで取得できます。