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

时间:2018-08-02 00:04:57

标签: android dagger-2 dagger

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

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

  

没有@Provides注释的方法就无法提供活动。

据我了解,由于Activity已被注入ActivityComponent中,并且Fragment只是将自身添加到ActivityComponent中,因此它应该获取所有提供的依赖项由ActivityComponentAppComponent的模块组成。我在ActivityComponent中看到了这种情况,在那里我自动从AppComponent获取依赖项。

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

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

但这对我来说没有意义,因为我希望从Activity中获得预先注入的ActivityComponent

1 个答案:

答案 0 :(得分:0)

我意识到父组件应该始终声明它们要公开的依赖项。否则,依赖组件不能仅通过将它们声明为依赖项来访问它们。请注意,传递依赖项也不起作用。因此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
}