Navigation ComposeのSafe Argsで現在の画面を判定する方法とpopBackStackの対応方法

Kenji Abe
Jul 16, 2024

--

Photo by Nick Fewings on Unsplash

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)

--

--

Kenji Abe
Kenji Abe

Written by Kenji Abe

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO

No responses yet