Skip to content

Instantly share code, notes, and snippets.

@prasanthperumal92
Created January 1, 2024 16:58
Show Gist options
  • Save prasanthperumal92/4bb263bb41c39a015dba94a5d9622071 to your computer and use it in GitHub Desktop.
Save prasanthperumal92/4bb263bb41c39a015dba94a5d9622071 to your computer and use it in GitHub Desktop.
A single file abstraction for compose navigation with the help of reflection .
package com.prasanth.sampleapp.navigation
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.navigation.NamedNavArgument
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.prasanth.sampleapp.view.DetailScreen
import com.prasanth.sampleapp.view.HomeScreen
@Composable
fun AppNavigation(modifier: Modifier = Modifier) {
val navController = rememberNavController()
val navigator = AppNavigation(navController)
NavHost(
navController = navController,
startDestination = NavigationRoute.HOME.toString(),
modifier = modifier,
) {
NavigationRoute::class.nestedClasses.forEach {
val datObj = it.objectInstance
if (datObj is NavigationRoute) {
composable(route = datObj.name, arguments = datObj.args) {
datObj.screen?.invoke(navigator)
}
}
}
}
}
sealed class NavigationRoute(
val name: String = "",
val args: List<NamedNavArgument> = listOf(),
val screen: @Composable ((navController: AppNavigation) -> Unit)? = null,
) {
data object HOME : NavigationRoute(name = "home", screen = { HomeScreen(it) })
data object DETAILSCREEN : NavigationRoute(name = "detail", screen = { DetailScreen(it) })
}
class AppNavigation(private val navController: NavController) {
fun navigate(destination: NavigationRoute) {
navController.navigate(destination.name)
}
fun navigateUp() {
navController.navigateUp()
}
fun setResult(key: String = "ACTION_RESULT", value: Any?) {
navController.previousBackStackEntry?.savedStateHandle?.set(key, value)
}
fun <T> getResult(key: String = "ACTION_RESULT"): T? {
return navController.currentBackStackEntry?.savedStateHandle?.get<T>(key)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment