Skip to content

Instantly share code, notes, and snippets.

@levinzonr
Last active August 22, 2021 16:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save levinzonr/2acc21de9050da35d2929112310fc7b5 to your computer and use it in GitHub Desktop.
Save levinzonr/2acc21de9050da35d2929112310fc7b5 to your computer and use it in GitHub Desktop.
Safe Routing generated files example
// Routes.kt
object Routes {
/**
* A description of the "home" route, including its full path and an navArgs
*/
val Home: RouteSpec<Unit> = object : RouteSpec<Unit> {
override val route: String = "home"
override val argsFactory: RouteArgsFactory<Unit> = EmptyArgsFactory
override val navArgs: List<NamedNavArgument> = listOf()
}
/**
* A description of the "details" route, including its full path and an navArgs
*/
val Details: RouteSpec<DetailsRouteArgs> = object : RouteSpec<DetailsRouteArgs> {
override val route: String = "details/{id}?number={number}"
override val argsFactory: RouteArgsFactory<DetailsRouteArgs> = DetailsRouteArgsFactory
override val navArgs: List<NamedNavArgument> = DetailsRouteArgs.navArgs
}
}
/**
* This object contains helpers to build actions used to navigate to different routes based on
* @Route annotations
*/
object RoutesActions {
/**
* Builds an action to "home" route
*/
fun toHome(): String = "home"
/**x
* Builds an action to "details" route
*/
fun toDetails(id: String): String = "details/$id"
fun toDetails(id: String, number: Int = 1): String = "details/$id?number=$number"
}
/**
* An Arguments holder for the "details" route
*/
data class DetailsRouteArgs(
val id: String,
val number: Int
) {
companion object {
/**
* NamedNavArgs representation for DetailsRouteArgs
*/
val navArgs: List<NamedNavArgument> = listOf(
navArgument("id") {
type = NavType.StringType
nullable = false
},
navArgument("number") {
type = NavType.IntType
nullable = false
defaultValue = 1
},
)
}
}
object DetailsRouteArgsFactory : RouteArgsFactory<DetailsRouteArgs> {
/**
* A Helper function to obtain an instance of DetailsRouteArgs from Bundle
*/
override fun fromBundle(bundle: Bundle?): DetailsRouteArgs {
val id = requireNotNull(bundle?.getString("id"))
val number = requireNotNull(bundle?.getInt("number"))
return DetailsRouteArgs(id, number)
}
/**
* A Helper function to obtain an instance of DetailsRouteArgs from SavedStateHandle
*/
override fun fromSavedStateHandle(handle: SavedStateHandle?): DetailsRouteArgs {
val id = requireNotNull(handle?.get<String>("id"))
val number = requireNotNull(handle?.get<Int>("number"))
return DetailsRouteArgs(id, number)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment