Navigation Compose で最初の画面に引数を渡す方法についてです。
例えば、Activityのパラメータをそのまま Composable 関数に渡したい場合などがあります。そのときにどのようにすれば良いかを紹介します。
例えば、以下ように最初の画面に id パラメータを渡したい場合です。
NavHost(
navController = navController,
startDestination = "start/{id}"
) {
composable(
"start/{id}",
arguments = listOf(
navArgument("id") {
type = NavType.IntType
}
)
) { backStackEntry ->
val id = backStackEntry.arguments?.getInt("id")
// ...
}
}
まず startDestination
に直接 start/123
のように渡せば動きそうですが、これでは引数を画面のほうから取得することができません。
NavHost(
navController = navController,
startDestination = "start/123" // <= ココ (これはうまく動かない)
) {
// ...
}
startDestination
に引数を渡したい場合は、以下のように defaultValue
を使って渡すことができます。
NavHost(
navController = navController,
startDestination = "start/{id}"
) {
composable(
"start/{id}",
arguments = listOf(
navArgument("id") {
type = NavType.IntType
defaultValue = 123 // <= ここに最初の画面の引数を設定する
}
)
) { backStackEntry ->
val id = backStackEntry.arguments?.getInt("id")
// ...
}
}
これで最初の画面に引数を渡すことができます。
なぜ引数として渡したいのか?
他の方法として思いつくことは、直接 Composable 関数に引数を渡す方法です。
NavHost(
navController = navController,
startDestination = "start"
) {
composable("start") {
StartScreen(id = 123) // <= 直接渡す
}
}
これでも良いのですが、この方法では ViewModel から SavedStateHandle
から取得することはできなくなります。
ViewModelで引数を直接扱いたい場合などでは defaultValue
を使う必要があります。