Skip to content
This repository has been archived by the owner on Feb 8, 2022. It is now read-only.
/ Navigator Public archive

Android Multi-module navigator, trying to find a way to navigate into a modularized android project

License

Notifications You must be signed in to change notification settings

florent37/Navigator

Repository files navigation

Navigator

Android Multi-module navigator, trying to find a way to navigate into a modularized android multi module project

Import

implementation"com.github.florent37:navigator:1.0.0"

Multi module sample

project
|
\--app
|
\--routing
|
\--splash
|
\--home
|
\--user

And we want the next screen flow

app --[directly starts]--> Splash --> Home --[clicks on an user]--> User(id)
  • splashshould only knowrouting
  • homeshould only knowrouting
  • usershould only knowrouting
  • appshould only knowroutingto present the splash
  • routingshould not know others modules

Define routes

In a dedicated module, created shared routes into aRouteobject

in modulerouting:

objectRoutes {

objectSplash: Route("/")

objectHome: Route("/home")

objectUser: RouteWithParams<UserParams>("/user/{userId}") {
classUserParams(valuserId:String): Param
}
}

Bind routes

You need to associate an intent to eachRoutein your feature's module

in modulesplash:

Routes.Splash.register { context->
Intent(context,SplashActivity::class.java)
}

If you want an android module to register automatically its route, you can bind usingapplicationprovider's auto providers:

//automatically launched after application's onCreate()
classRouteProvider:Provider() {
overridefunprovide() {
Routes.Splash.register { context->
Intent(context,SplashActivity::class.java)
}
}
}

then declare it in your module's AndroidManifest.xml

<provider
android:authorities="${applicationId}.splash.RouteProvider"
android:name=".RouteProvider"/>

Navigation

Push

You can push a route from an activity (or fragment) using

Navigator.of(this).push(Routes.Home)

or by its path

Navigator.of(this).push("/home/")

Push

You can also change the route from anywhere (eg: an android ViewModel) usingNavigator.current()

Navigator.current()?.push(Routes.Home)

A route with parameters

Navigating to a route with parameters forces to specify values

Navigator.of(this).push(Routes.User,UserParams(userId="3"))

You can retrieve them using kotlin's delegated properties

classUserActivity:Activity{
privatevalargs by parameter<Routes.User.Params>()

overridefunonCreate(savedInstanceState:Bundle?) {
super.onCreate(savedInstanceState)

valuserId=args.userId

You can also call it by path's params

Navigator.of(this).push("/user/3")

It will usemoshito create the parameter from path params

Pop

Navigator.of(this).pop()

PushReplacement

If you want to replace the current screen

Navigator.current()?.pushReplacement(Routes.Splash)

Route Flavors

A flavor is an endpoint of a route, you can use them to navigate to an Activity's BottomNavigation item

objectHome: Route("/home/") {
objectUserTabs: Flavor<Home>(this,"home/tabUsers")

objectPostsTabs: FlavorWithParams<Home, PostsTabs.Params>(this,"home/tabPosts") {
classParams(valuserId:Int?): Parameter()
}
}

You can push this like a route

Navigator.current()?.push(Routes.Home.UserTabs)

Push

And bind this into your Activity

classHomeActivity:AppCompatActivity(R.layout.activity_home) {

overridefunonCreate(savedInstanceState:Bundle?) {
super.onCreate(savedInstanceState)

viewPager.adapter=ViewPagerAdapter(
supportFragmentManager
)

bottomNav.setupWithViewPager(viewPager)

bindFlavor(Routes.Home.UserTabs,intent)
.withBottomNav(bottomNav,R.id.tabUsers)

bindFlavor(Routes.Home.PostsTabs,intent)
.withBottomNav(bottomNav,R.id.tabPosts)

}
}

And to retrieve a flavor parameter

classPostsFragment:Fragment{
privatevarargs by optionalFlavorParameter<Routes.Home.PostsTabs.Params>()

overridefunonViewCreated(view:View,savedInstanceState:Bundle?) {
super.onViewCreated(view, savedInstanceState)

valuserId=args.userId

Credits

Author: Florent Champignyhttp:// florentchampigny /

License

Copyright 2019 Florent37, Inc.

Licensed under the Apache License, Version 2.0 (the "License" );
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http:// apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Android Multi-module navigator, trying to find a way to navigate into a modularized android project

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published