2.8.0-alpha08 でNavigation ComposeがSafe Argsに対応しました。これまでは文字列でRouteを扱っていましたが、Safe Argsではobjectやdata classで扱うことになります。
そのためこれまでの実装とは扱いが変わってくるので、迷いそうな2つの実装について紹介します。
現在の画面を判定する
これまでは、以下のように現在のBackStackEntryからRouteを文字列で比較する感じでした。
val currentBackStack by navController.currentBackStackEntryAsState()
val currentRoute = currentBackStack?.destination?.route
if (currentRoute == "...") {
// ...
}
Safe Argsを使った場合だと基本はRouteは定義したものから自動生成になります。Safe Argsで現在の画面を判定するには、 hasRoute
を使って以下のように判定します。
val currentBackStack by navController.currentBackStackEntryAsState()
if (currentBackStack?.destination?.hasRoute(Profile::class) == true) {
// ...
}
hasRoute
の引数には判定した画面の定義したクラスを指定します。対象の画面が表示している場合はtrueを返してくれます。
popBackStackで指定画面まで戻る
以前の実装で popBackStack
を使って指定の画面に戻る場合は以下のように単純に文字列でRouteを指定するだけでした。
navController.popBackStack(route = "profile", inclusive = false)
Safe Argsの場合は対象画面のクラスを型パラメータで指定する感じになります。
navController.popBackStack<Profile>(inclusive = false)
また、パラメーターまで指定してすることも可能です。これは複数の同じ画面がBackStackにあるときに具体的な画面を指定する感じなります。
navController.popBackStack(route = Profile(id = "1"), false)