首页 > 解决方案 > 无法从 Dagger(Android)中的 Fragment 组件访问 Activity 组件

问题描述

我正在尝试为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
}

我在尝试访问活动的地方遇到编译错误。

如果没有 @Provides-annotated 方法,就无法提供活动。

我的理解是,既然Activity已经被注入了ActivityComponent, 并且Fragment只是将自己添加到 中ActivityComponent,它应该得到ActivityComponentandAppComponent的模块提供的所有依赖项。我看到这种情况发生在ActivityComponent,我从那里AppComponent自动获取依赖项。

更新:如果我将以下代码添加到FragmentModule,我可以编译代码:

@Provides
fun provideActivity() = fragment.context as Activity

但这对我来说没有意义,因为我希望ActivityActivityComponent

标签: androiddagger-2dagger

解决方案


我意识到父组件应该始终声明它们想要公开的依赖项。否则,依赖组件不能仅通过将它们声明为依赖项来访问它们。请注意,传递依赖也不起作用。因此AppComponent必须声明一个依赖项ActivityComponent才能使用它 - 但如果需要它ActivityComponent必须重新声明相同的依赖项。FragmentComponent

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
}

推荐阅读