使用Dagger的Application Component构建Android Instant App

时间:2017-07-28 18:28:50

标签: android dagger-2 android-instant-apps

我目前正在尝试使用InstantApps,并希望将dagger包含在我的项目中。

我在设置应用AppComponent时遇到了问题。我的应用程序组件包括我的应用程序的所有功能匕首模块。

我基本上有:

  • 包含我的应用类
  • 的One Base应用模块
  • 多项功能,每个活动都有一个匕首模块,所有这些都以Base作为依赖项。
  • 一个应用模块和即时模块,同时导入所有功能和基本应用模块。

我在添加Instant App模块之前试图找出设置。

来自InstantApps文档和项目示例。似乎Application类需要在Base中。从Dagger文档,到设置匕首:

 DaggerYourAppComponent.create().inject(this);

应包含在您的应用程序类中。但是,这似乎是不可能的,因为AppComponent需要引用所有功能匕首模块。

我的问题是:

  • 我应该在哪里添加AppComponent匕首模块?
  • 我应该将我的应用程序保存在app模块中而不是Base中吗?
  • 使用Instant Apps围绕Dagger的任何GitHub回购或文档?

谢谢

2 个答案:

答案 0 :(得分:12)

  • 即时应用程序非常支持Dagger2。您可以为每个要素模块和相应的Dagger提供程序类创建Component类,以公开每个要素模块的组件类实例。
  • 每个模块组件类都可以为仅包含在该功能模块中的类声明注入方法。
  • 此外,您还可以拥有一个Application组件类 用于全范围注射的基础模块。
  • 应用程序组件类可以在实例化中实例化 应用程序类包含在基本模块中并暴露给其他模块 功能模块通过应用程序类中的静态方法。

以下是使用Instant应用程序注入Dagger2的示例代码,以使事情更加清晰。 https://github.com/willowtreeapps/android-instant-apps-demo

答案 1 :(得分:2)

我写了一篇关于此的文章,其中包含许多细节:Dagger2 for Modular Architecture,但是简短的回答。

您必须以不同的方式使用Dagger2。您不需要为每个要素模块使用模块或子组件,而是需要使用与基础AppComponent具有依赖关系的组件。

在单个模块中,我们通常会这样做:

@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)
  }
 }

但正如您所说,您无法访问可能位于另一个模块中的SubComponentModule或另一个功能模块中的参考dagger模块。

您可以在功能模块中创建一个新的匕首模块,具体取决于ApplicationComponent,如下所示:

@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
  }
}

相应的功能活动将构建组件:

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)
  }
}