无法从Dagger(Android)中的碎片组件访问活动组件



我正在尝试为ActivityFragment创建依赖组件。这是我的活动组件

@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中,因此它应该获得ActivityComponentAppComponent的模块提供的所有依赖项。我在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
}

最新更新