使用导航组件时,如何检查片段是否在堆栈中?
我能想到的一件事就是尝试使用
获得NavBackStackEntry
val backStackEntry=findNavController().getBackStackEntry(R.id.courseTrackFeedbackFragment)
在文档中,它说如果目标不在堆栈上,则会抛出IllegalArgumentException。但这看起来像黑客一样,有更好的方法吗?
答案 0 :(得分:0)
是的,这似乎是今天的唯一方法
try {
getBackStackEntry(resId)
} catch (ignored: Throwable) {
}
答案 1 :(得分:0)
一个简单的扩展功能:
fun NavController.isFragmentRemovedFromBackStack(destinationId: Int) =
try {
getBackStackEntry(destinationId)
false
} catch (e: Exception) {
true
}
答案 2 :(得分:0)
好像没有别的办法了,这些是我目前使用的扩展
fun NavController.isFragmentInBackStack(destinationId: Int) =
try {
getBackStackEntry(destinationId)
true
} catch (e: Exception) {
false
}
和
fun Fragment.isFragmentInBackStack(destinationId: Int) =
try {
findNavController().getBackStackEntry(destinationId)
true
} catch (e: Exception) {
false
}
用法
if (isFragmentInBackStack(R.id.myFragment)){
findNavController().popBackStack(R.id.myFragment,false)
} else {
val action = MyCurrentFragmentDirections.actionToMyFragment()
findNavController().navigateSafe(action)
}