我正在尝试为Activity
和Fragment
创建依赖组件。这是我的活动组件:
@Component(modules = [ActivityModule::class],
dependencies = [AppComponent::class])
interface ActivityComponent{
fun inject(activity: Activity)
@Component.Builder
interface Builder{
fun appComponent(component: AppComponent): Builder
fun activityModule(activityModule: ActivityModule): Builder
fun build(): ActivityComponent
}
}
@Module
class ActivityModule(private val activity: Activity) {
@Provides
fun provideActivity() = activity
}
碎片组件:
@Component(modules = [FragmentModule::class],
dependencies = [ActivityComponent::class])
interface FragmentComponent{
fun inject(fragment: Fragment)
@Component.Builder
interface Builder{
fun activityComponent(activityComponent: ActivityComponent): Builder
fun fragmentModule(fragmentModule: fragmentModule): Builder
fun build(): FragmentComponent
}
}
@Module
class FragmentModule(private val fragment: Fragment) {
@Provides
fun provideFragment() = fragment
}
我在尝试访问活动的地方遇到编译错误。
如果没有@Providers注释的方法,就无法提供活动。
我的理解是,由于Activity
已经被注入到ActivityComponent
中,而Fragment
只是将自己添加到ActivityComponent
中,因此它应该获得ActivityComponent
和AppComponent
的模块提供的所有依赖项。我在ActivityComponent
中看到了这种情况,在那里我自动从AppComponent
获得依赖关系。
更新:如果我将以下代码添加到FragmentModule
,我就可以编译代码:
@Provides
fun provideActivity() = fragment.context as Activity
但这对我来说没有意义,因为我希望从ActivityComponent
中获得预注入的Activity
我意识到父组件应该始终声明它们想要公开的依赖关系。否则,依赖组件不能仅通过将它们声明为依赖组件来访问它们。请注意,可传递的依赖关系也不起作用。因此,AppComponent
必须为ActivityComponent
声明一个依赖项才能使用它,但如果FragmentComponent
需要,ActivityComponent
必须重新声明相同的依赖项。
interface ActivityComponent{
fun inject(activity: Activity)
@Component.Builder
interface Builder{
fun appComponent(component: AppComponent): Builder
fun activityModule(activityModule: ActivityModule): Builder
fun build(): ActivityComponent
}
var activity: Activity
}