I'm wondering how to properly scope dependencies with Koin library.
Since Google recommends a single Activity
architecture the AndroidX Navigation lib has become a key library to facilitate this by easily swapping Fragment
s.
A typical modern Android app has multiple features separated in packages and/or Gradle
modules.
These feature modules provides a graph that can be used in the root graph as nested graphs. (See picture)
<?xml version="1.0" encoding="utf-8"?>
<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/root_graph"
app:startDestination="@id/mainFragment">
<include app:graph="@navigation/nav_graph_feature_a" />
<include app:graph="@navigation/nav_graph_feature_b" />
<fragment
android:id="@+id/mainFragment"
android:name="com.example.androidx_navigation.MainFragment"
android:label="MainFragment"
tools:layout="@layout/fragment_main">
<action
android:id="@+id/action_mainFragment_to_featureAFragment1"
app:destination="@id/nav_graph_feature_a" />
<action
android:id="@+id/action_mainFragment_to_featureBFragment1"
app:destination="@id/nav_graph_feature_b" />
</fragment>
</navigation>
Following rules should be respected:
- Every layer represent a scope.
- Inner layers can inject anything defined in outer layers.
- Layers that do not have an overlap should not be able to inject each other's dependencies.
- Leaving a layer should dispose of its dependencies.
More concretely:
- FeatureA can inject Activity and App dependencies, but not FeatureB dependencies
- FeatureB can inject Activity and App dependencies, but not FeatureA dependencies
How to achieve this in Koin?
Note that sharing dependencies is not limited to ViewModel only.
I should be able to share any arbitrary class within my scope.