Router and path-based navigation
Defining a RouteResolver
RouteResolver/*
The following screen classes are defined elsewhere
class MainScreen:Screen
class TestBasicScreen1:Screen
class TestBasicScreen2:Screen
class TestBasicCounterBlocScreen:Screen
class TestBasicCounterCubitScreen:Screen
class HelloUser(val userName:String):Screen
*/
//An object where we define both some labels with the route path segments
//(not required, but recommended) and the RouteResolver itself, that define how each
// URL should be mapped to a Screen instance.
// The mapping
object AppRoutes {
val home = "home"
val hello = "hello"
val testbasic = "testbasic"
fun testbasic_(testNumber:Int)="$testbasic/$testNumber"
val counter = "counter"
val seg_counter_bloc = "bloc"
val seg_counter_cubit="cubit"
val counter_bloc = "$counter/$seg_counter_bloc"
val counter_cubit = "$counter/$seg_counter_cubit"
//-----------------
//the first argument for RouteResolver constructor is the initial route
val resolver = RouteResolver("/") {
//route: "/home"
route(AppRoutes.home) {
MainScreen()
}
route(AppRoutes.hello) {
//route: "/hello/{string}" where {string} is a string
string {
HelloUser(userName=it)
}
}
//route: "/testbasic"
route(AppRoutes.testbasic) {
//route: "/testbasic/{int}" where {int} must be an integer
int {
when(it) { //"it" is the parsed integer {int}
1 -> TestBasicScreen1()
2 -> TestBasicScreen2()
else -> MainScreen()
}
}
noMatch {
MainScreen()
}
}
//route: "/counter"
route(AppRoutes.counter) {
//route: "/counter/bloc"
route(AppRoutes.seg_counter_bloc) {
TestBasicCounterBlocScreen()
}
//route: "/counter/cubit"
route(AppRoutes.seg_counter_cubit) {
TestBasicCounterCubitScreen()
}
//route selected for all "/counter/<some subroute>" where <some subroute>
//is not matched with previous explicit rules
noMatch {
MainScreen()
}
}
noMatch {
MainScreen()
}
}
}
//for compose web, we pass the RouteResolver in renderComposableInBodyWithNavigator
// that initialize the rootnavigator.
// For android and desktop platforms we pass the RouteResolver to RootNavigator()
fun main() {
renderComposableInBodyWithNavigator(AppRoutes.resolver)
}How to navigate with a router
Matching multiple path segments at once
Dynamic routes
Route with Query parameters
Redirects
enableCheckForPathSegmentsExtraSlashes flag in RouteResolver
enableCheckForPathSegmentsExtraSlashes flag in RouteResolverHashed vs. Non-Hashed URL Paths
Last updated