krouter
denisidoro
105
Visit GitHub RepoNavigations

Krouter

A lightweight Android activity router written in Kotlin.

crossroads

Basic usage

// anywhere in the app, preferably on application creation
val krouter = Krouter.from(context, hashMapOf(
    "user/:id/likes" to UserLikesActivity::class.java
))

// anywhere that can access the val above
krouter.start("user/42/likes") // this will start UserLikesActivity

// inside UserLikesActivity, possibly inside onCreate()
val id: Int = intent.getIntExtra("id", 0) // 42

Adding more extras

In order to add more extras to the intent, one can do the following:

krouter.getRouter("user/42/likes")!!
    .withIntent { it.putExtra("name", "John") }
    .start()

Starting for result

In order to set a request code:

krouter.getRouter("user/42/likes")!!
    .startForResult(activity, 123) // 123 is the request code

Advanced routing configuration

It is possible to instantiate Krouter establishing a regular expression that the parameter must specify:

val krouter = Krouter(context, hashMapOf(
    Route("user/:id/likes", hashMapOf(
        "id" to Schema("^[0-9]{2}$")
    )) to UserLikesActivity::class.java
)

There are default implementations for integer, float, double, long, char:

// the constants must be statically imported from Schema.Type
Route("user/:id/likes", hashMapOf("id" to Schema(INT)))
Route("my/balance/:value", hashMapOf("value" to Schema(FLOAT)))

If no schema is defined, Krouter will try to infer the type accordingly. If no schema is suitable, the param will be coerced to a String.

Interceptor

You can add some interceptors to Krouter:

// If you are not logged in, go to login
krouter.addInterceptor(object : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Router? {

        val route = chain.request()
        if(route?.url == "user/:id" && !login) {
            val target = chain.proceed(route)
            val router = krouter.getRouter("login")
            router?.intent?.putExtra("nav", target?.url)
            router?.update()
            return router
        }
        return chain.proceed(route)
    }

})

Installation

Add the dependency:

dependencies {
    compile 'com.github.denisidoro.github:krouter:0.0.2'
}

Best practices

  • Use dependency injection: Krouter was idealized to be used in conjunction with Dagger.
  • Compose routers: say you have an activity flow in your app that's only accessible to users who are admin, for instance. If you don't want to deal with a huge routing map that has routes all flows, then create multiple Krouter instances. val globalKrouter and @AdminScope val adminKrouter, for example.
Become a better Android Developer
Millions of developers are learning at MindOrks

Online Training Program

Featured Blogs

Our Team

MindOrks is Certainly one of the best online blog to stay on top of all the Android development news, coding and design patterns. Finally a blog I can count on to keep myself updated with latest and greatest things happening in Android world.

Vipul Shah
Android Developer
Microsoft

Become Pro in Android by watching videos

OUR LEARNERS WORK AT