Navigationによる遷移の問題
ボタンタップ時の遷移にnavController.navigate()を使用していると、時々こんなクラッシュが発生する
Fatal Exception: java.lang.IllegalArgumentException: Navigation action/destination a_to_b cannot be found from the current destination Destination
高速タップをした際などに既にdestinationでは遷移したことになっているのに遷移しようとしてクラッシュしている
(手元で再現したい人はnavController.navigate()を2回連続で呼んでみると簡単に再現する)
解決案
遷移前に今の画面を確認するような処理を入れることで解消する
if (navController.currentDestination?.id == 遷移元画面のID) {
navController.navigate(遷移アクション)
}
毎回確認処理を入れるとコード量が無駄に増えていくので、以下のような拡張関数で処理をまとめる
fun NavController.isCurrentDestination(
/** 対象の宛先 */
@IdRes resId: Int
): Boolean {
return currentDestination?.id == resId
}
あとは遷移時にはこの拡張関数を使うようにすれば解決する。
発展
今回は現在画面のチェックまでしか拡張関数化していないが、チェックから遷移までを拡張関数化すればよりコード量の削減と効率化に繋がりそう。