Reputation: 4127
I'm trying to implement the new navigation component with dynamic features
So the structure looks like this:
dynamicFeatures = []
included in gradle)features
library -> globalNav
I've been reading a lot with no success how to glue these together without depending on each other as each feature is completely isolated
e.g The app (app module)
starts with the SplashActivity
and checks the session state, so my question is how should I start the login_graph
or home_graph
and in the first case, start the home after finishing the auth flow?
The way I'm currently trying gluing'em together is using a globalNav
module (android-library) I found a couple of workarounds:
Intent().setClassName(context.packageName, className).also { context.startActivity(it) }
Deeplinks (the one I wanted to use as my nav graph already has those) but for some reason, it always shows the "Choose complete action" picker even though only my app takes it.
actions
but the same behavior as deeplinksAny suggestions would be great :)
PS: Some references that I've been viewing/reading on:
https://www.youtube.com/watch?v=ST2W1Y_Ztvk
https://jeroenmols.com/blog/2019/04/02/modularizationexample/
GitHub googlesamples
repository
PSS: I'm actively trying to figure this out if I find a good solution I'll make sure to answer too.
For anyone interested in this, as it isn't currently supported, you can star the issue here: https://issuetracker.google.com/issues/132170186
Upvotes: 12
Views: 2299
Reputation: 17922
Navigation in on-demand feature modules is supported by using the navigation-dynamic-feature-*
components. The most recent version can be found on maven.google.com.
We do have a sample available that demonstrates both XML and Kotlin DSL declaration possibilites.
The documentation is available here
For more info you can also watch the recording on this from the Android Dev Summit 2019.
Upvotes: 3
Reputation: 1326
This is now supported in androidx.navigation:navigation-dynamic-features-fragment:2.3.0
.
Just include app:moduleName
in navigation.
Example:
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/menu_nav_graph"
app:startDestination="@id/main_fragment">
<!-- this fragment is in base module -->
<fragment
android:id="@+id/main_fragment"
android:name="com.example.app.MainFragment"
tools:layout="@layout/fragment_main" />
<!-- activity and fragment in a different module -->
<activity
android:id="@+id/splash_activity"
android:name="com.example.examplemodule.splash.SplashActivity"
app:moduleName="examplemodule" />
<fragment
android:id="@+id/user_profile"
android:name="com.example.examplemodule.user.UserProfileFragment"
android:label="UserProfileFragment"
app:moduleName="examplemodule" />
</navigation>
You can call findNavController().navigate(R.id.splash_activity)
from anywhere, and it will install examplemodule
for you if necessary.
Upvotes: 1
Reputation: 93
I was also facing with same problem couple minutes ago and I saw your question while trying to find an answer.
In my case I am having 2 modules app and login. The module login is dynamic-feature module which depends on module app. The module login contains all the logic and navigation for logging purpose (it contains login, register and so on). I wanted to include this LoginActivity (which is an activity in login module which has all navigation in it) in the main navigation graph in app module. We can not call LoginActivity from app layer which it does not know about it. But
<activity android:id="@+id/loginActivity"
android:name="login.LoginActivity"
android:label="LoginActivity"/>
adding it manually in main nav graph worked for me.
Upvotes: 0