首页 > 解决方案 > Dagger 2 - 当另一个提供方法取决于其返回类型时,@ContributesAndroidInjector 的行为方式

问题描述

我有两种提供方法,一种取决于另一种方法提供的对象。下面的代码可以正常工作,问题在问题部分下说明

工作示例

StringProviderModule中,添加了一个依赖于Fragment父组件中提供的对象(实例)的方法。

@Module
class StringProviderModule {
    @Module
    companion object{
        @JvmStatic
        @Provides
        fun provideFragmentArgument(cripledFragment: CripledFragment): String{
            return cripledFragment.arguments?.getString(CripledFragment.ARG_STRING) ?: "No such argument"
        }
    }
}

FragmentModule中,将StringProviderModule添加到FragmentModule生成的子组件中

@Module
abstract class FragmentModule {

    @ContributesAndroidInjector(modules = [StringProviderModule::class])
    abstract fun fragment: CripledFragment
}

ActivityBinderModule中,将FragmentModule添加到ActivityBinderModule的生成子组件中

@Module
abstract class ActivityBinderModule {

    @ContributesAndroidInjector(modules = [FragmentModule::class])
    abstract fun mainActivity(): MainActivity
}

AppComponent中,将ActivityBinderModule添加为模块

@Component(modules = [
    AndroidSupportInjectionModule::class, 
    ActivityBinderModule::class
])
interface AppComponent: AndroidInjector<DaggerMyApp> {
    @Component.Builder
    interface Builder{
        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }
}

然后@Injecting String 到Presenterclass 和@Injecting 那个演示者到CripledFragment. 我可以在 Presenter 中访问 Fragment 的 String 参数。实现并不重要,因为它超出了问题的范围,不过,如果需要,我可以添加代码。

问题

合并StringProviderModuleFragmentModule时,IDE 抱怨以下消息“如果没有 @Inject 构造函数或 @Provides-annotated 方法,则无法提供 CripledFragment”。是不是@ContributesAndroidInjector已经提供了一个实例CripledFragment

@Module
abstract class FragmentModule {

    @ContributesAndroidInjector
    abstract fun cripledFragment(): CripledFragment

    @Module
    companion object{

        @JvmStatic
        @Provides
        fun provideFragmentArgument(cripledFragment: CripledFragment): String{
            return cripledFragment.arguments?.getString(CripledFragment.ARG_STRING) ?: "No such argument"
        }
    }
}

我检查了多个教程和匕首文档,找不到任何适当的解释来推断我的问题的原因。非常感谢简单的解释而不是建议解决方案,因为我不是在寻找具体的解决方案。

标签: dagger-2dagger

解决方案


这个问题已经在这里回答了。基本上,它为它生成的子组件@ContributesAndroidInjector提供实例,而不是为它所在的模块(在这种情况下)提供实例。这意味着内部的任何提供方法都可以访问's 实例。MainActivityActivityBinderModuleFragmentModuleMainActivity

@Module
abstract class ActivityBinderModule {

    @ContributesAndroidInjector(modules = [FragmentModule::class])
    abstract fun mainActivity(): MainActivity
}

推荐阅读