Compose Navigation how to check current navigation's route and match it with data class/object?

Compose Navigation how to check current navigation's route and match it with data class/object?
android
Ethan Jackson
@Serializable data object HomeRoute composable<HomeRoute> { entry -> HomeRoute(...) }
val currentBackStackEntry = navController.currentBackStackEntryAsState() val route = currentBackStackEntry.value?.destination?.route LaunchedEffect(route) { val homeClassName = HomeRoute::class.java.name Timber.d("currentRoute: $route vs $homeClassName, ${route?.startsWith(homeClassName)}") }

In the debug it prints:

currentRoute: com.example.app.home.navigation.HomeRoute vs com.example.app.home.navigation.HomeRoute, true

But for release build with isMinifyEnabled = true it won't work because HomeRoute will be obfuscated but navigation routes won't be:

It prints: currentRoute: com.example.app.home.navigation.HomeRoute vs P5.d, false

In this case I would need to add @Keep annotation:

@Keep @Serializable data object HomeRoute

Is there any other way to match/compare routes?

Answer

There is actually NavDestination.hasRoute extension:

@OptIn(InternalSerializationApi::class) @JvmStatic public fun <T : Any> NavDestination.hasRoute(route: KClass<T>) = route.serializer().generateHashCode() == id
val currentBackStackEntry = navController.currentBackStackEntryAsState() val isHomeRoute = currentBackStackEntry.value?.destination?.hasRoute(HomeRoute::class)

Related Articles