I'm currently experimenting with InstantApps and would like to include dagger into my project.
I'm facing an issue setting up an application AppComponent. My application component includes all the feature dagger modules of my app.
I basically have:
I'm trying to figure out the setup before adding the Instant App module.
From InstantApps documentation and project examples. It seems like the Application class needs to be in Base. From the Dagger documentation, to setup dagger:
DaggerYourAppComponent.create().inject(this);
Should be included in your application class. However, this seems to be impossible as the AppComponent needs to reference all the feature dagger modules.
My questions are:
Thank you
Here is a sample code of Dagger2 injection with Instant apps to make things clearer. https://github.com/willowtreeapps/android-instant-apps-demo
I wrote an article about this with many details: Dagger2 for Modular Architecture, but following the short answer.
You have to use Dagger2 in a different way. Instead of using a module or subcomponent for each feature module, you need to use a component with a dependency to the base AppComponent.
In a single module we are usually do something like this:
@Singleton
@Component(modules = arrayOf(NetworkModule::class, RepositoryModule::class,
SubcomponentModule::class))
interface ApplicationComponent : AndroidInjector<MyApplication> {
val userRepository: UserRepository
val apiService: ApiService
}
@Module
object NetworkModule {
@Provides
@Singleton
@JvmStatic
fun provideApiService(okHttp: OkHttp): ApiService {
return ApiSerive(okHttp)
}
}
But as you said you don't have access to SubComponentModule that could be in another module or reference dagger modules in another feature module.
You can just create a new dagger module in a feature module depending on ApplicationComponent like this:
@Browser
@Component(modules = [(BrowserModule::class)],
dependencies = [(AppComponent::class)])
interface BrowserComponent : AndroidInjector<AppCompatActivity> {
@Component.Builder
abstract class Builder: AndroidInjector.Builder<AppCompatActivity>(){
/**
* explicity declare to Dagger2
* that this builder will accept an AppComponent instance
**/
abstract fun plus(component: AppComponent): Builder
}
}
And the corresponding feature activity will build the component:
class BrowserActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DaggerBrowserComponent
.builder()
/**
* we have to provide an instance of the AppComponent or
* any other dependency for this component
**/
.plus((application as MyApplication).component)
.build()
.inject(this)
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With