【发布时间】:2019-05-20 12:08:00
【问题描述】:
我在注入我通过 @ContributesAndroidInjector 贡献的片段时遇到问题。
我正在尝试在模块(功能)中构建层次结构。基本上,我所拥有的是:
- 核心
- 应用
- 功能
我的AppComponent 依赖于CoreComponent:
@Singleton
@Component(modules = [CoreModule::class])
interface CoreComponent {
fun getApp(): Application
@Component.Factory
interface Factory {
fun create(@BindsInstance app: Application): CoreComponent
}
}
并初始化为:
@AppScope
@Component(
modules = [
AndroidInjectionModule::class,
ActivityContributor::class,
AppModule::class],
dependencies = [CoreComponent::class]
)
interface AppComponent : AndroidInjector<App> {
@Component.Factory
interface Factory {
fun create(component: CoreComponent): AppComponent
}
}
这部分非常简单。 AppComponent 有ActivityContributor,其中只有一个@ContributesAndroidInjector,即MainActivity。
现在,当我想添加一个封装的功能子组件时,问题就开始了。假设我的功能中有两个片段 FragmentOne 和 FragmentTwo,它们有一些常见的依赖关系以及它们自己的。
我想要的是一个FeatureSubcomponent,它有FeatureModule 和FeatureContributor:
@FeatureScope
@Subcomponent(
modules = [FeatureContributor::class,
FeatureModule::class
]
)
abstract class FeatureSubcomponent {
@Subcomponent.Factory
interface Factory {
fun create(): FeatureSubcomponent
}
}
虽然FeatureModule 对两个片段都有共同的依赖关系,但FeatureContributor 正在为FragmentOne 和FragmentTwo 贡献自己的模块:
@Module
abstract class FeatureContributor {
@ContributesAndroidInjector(modules = [FeatureOneModule::class])
abstract fun featureOneFragment(): FeatureOneFragment
@ContributesAndroidInjector(modules = [FeatureTwoModule::class])
abstract fun featureTwoFragment(): FeatureTwoFragment
}
当然,我将FeatureSubcomponent 作为子组件添加到AppModule:
@Module(subcomponents = [FeatureSubcomponent::class])
如果您向上滚动,您会看到 AppModule 包含在 AppComponent 的模块中。
问题是,在编译和运行时,由于No injector factory bound for 错误,一旦到达任何功能片段,它就会崩溃。
大概总结一下我的结构:
- 核心组件
- 应用组件
- 功能组件 (SUB)
- FeatureOneComponent (SUB)
- FeatureTwoComponent (SUB)
- 功能组件 (SUB)
任何人都知道为什么或应该如何,或者我错过了什么?
编辑
这是我准备的图表,以便更容易理解层次结构
【问题讨论】:
标签: android dependency-injection dagger-2