我在我的项目中遇到了同样的问题,最初我尝试对触发导航操作的视图进行防抖处理。但经过一些实验后,我发现在非常慢的设备上,防抖时间应该设置得非常高,这会导致拥有快速设备的用户感受到应用变慢。
因此,我提出了以下NavController扩展API,它与原始API相符并且易于使用:
fun NavController.safeNavigate(directions: NavDirections) {
try {
currentDestination?.getAction(directions.actionId) ?: return
navigate(directions.actionId, directions.arguments, null)
} catch (e : Exception) {
logError("Navigation error", e)
}
}
fun NavController.safeNavigate(directions: NavDirections, navOptions: NavOptions?) {
try {
currentDestination?.getAction(directions.actionId) ?: return
navigate(directions.actionId, directions.arguments, navOptions)
} catch (e : Exception) {
logError("Navigation error", e)
}
}
fun NavController.safeNavigate(directions: NavDirections, navigatorExtras: Navigator.Extras) {
try {
currentDestination?.getAction(directions.actionId) ?: return
navigate(directions.actionId, directions.arguments, null, navigatorExtras)
} catch (e : Exception) {
logError("Navigation error", e)
}
}
请注意,我正在使用SafeArgs和NavDirections。这些函数会检查当前目标是否有效,并且仅在操作不为空时进行导航。如果导航库每次返回正确的操作,则不需要try catch部分,但我想消除所有可能的崩溃。