开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情
上一篇我们讲了Dagger中的多component种的继承,今天我们讲多component中的依赖。
实现多component的组织可以通过继承,同时也可以使用依赖,下面看一个简单的依赖的例子:
- 先创建两个component:DependenciesComponent1 和 DependenciesComponent2
@Component(modules = [DependenciesModule1::class])
interface DependenciesComponent1 {
fun inject(activity: ActivityForDependencies)
}
@Component(modules = [DependenciesModule2::class])
interface DependenciesComponent2 {
}
这两个分别有自己依赖的module:
@Module
class DependenciesModule1 {
@Provides
fun providerBuilding():Building = Building()
}
@Module
class DependenciesModule2 {
@Provides
fun getCottage():Cottage = Cottage()
}
Module1提供了Building的实例,Module2提供了Cottage的实例,现在需要将Component2 依赖到Component1,那需要怎么做呢?首先是需要在Component1上写上相应的依赖:
@Component(modules = [DependenciesModule1::class],dependencies = [DependenciesComponent2::class])
interface DependenciesComponent1 {
fun inject(activity: ActivityForDependencies)
}
这里需要注意的是这个inject的类只能是在被依赖的component里面。
这样做还是不够的,如果只是这样做,其实component1中是不能去实例化component2中moudle中提供的provider的实例对象,必须要在component里面提供一个抽象的方法去告知依赖的component即component1.
@Component(modules = [DependenciesModule2::class])
interface DependenciesComponent2 {
fun getCottage():Cottage
}
这样写依赖就写完了,现在看看在全局inject的使用:
val dependenciesComponent2 = DaggerDependenciesComponent2.create()
DaggerDependenciesComponent1.builder().dependenciesComponent2(dependenciesComponent2).build().inject(this)
在activity里面首先需要实现被依赖的component的实例,然后再实例化component1的实例,并且将component2的实例设置过去,这样才算完成了。
这里说一个我犯的小错误,我刚开始没有将modul2中提供的provider实例在component2中做抽象方法,导致cottage一直找不到,所以大家也需要注意一下这一点哦。
下面我看看component2中我们写的抽象方法是怎样的:
public Cottage getCottage() {
return DependenciesModule2_GetCottageFactory.getCottage(dependenciesModule2);
}
这个就相当于一个代理的方法,负责将module2中的实例提供出去。
对于使用scope的component有以下规则:
- 没有scope的component可以依赖没有scope的component
- 有scope的component的可以依赖没有scope的component
- 如果component都有scope,那么scope要相同
- 如果component是singleTon的,那么它只能被依赖
以上就是今天的所有内容了,希望对大家有所帮助。