Skip to content Skip to sidebar Skip to footer

Building An Android Instant App With Application Component From Dagger

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

Solution 1:

  • Dagger2 is very much supported with Instant apps. You can create Component classes for each feature module and a corresponding Dagger provider class to expose the component class instance for each feature module.
  • Each module component class can declare inject methods for the classes contained only in that feature module.
  • In addition you can also have a Application component class in the base module for application wide injection.
  • The application component class can be instantiated in the Application class included in the base module and exposed to other feature modules via static method in the application class.

Here is a sample code of Dagger2 injection with Instant apps to make things clearer. https://github.com/willowtreeapps/android-instant-apps-demo

Solution 2:

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> {
  valuserRepository: UserRepositoryvalapiService: ApiService
}

@ModuleobjectNetworkModule {
  @Provides@Singleton@JvmStatic
  fun provideApiService(okHttp: OkHttp): ApiService {
    returnApiSerive(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)])interfaceBrowserComponent : AndroidInjector<AppCompatActivity> {
  @Component.Builder
  abstractclassBuilder: AndroidInjector.Builder<AppCompatActivity>(){
    /**
    *  explicity declare to Dagger2
    * that this builder will accept an AppComponent instance
    **/abstractfunplus(component: AppComponent): Builder
  }
}

And the corresponding feature activity will build the component:

classBrowserActivity : AppCompatActivity() {
  overridefunonCreate(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)
  }
}

Post a Comment for "Building An Android Instant App With Application Component From Dagger"