Dagger 2-当另一种提供方法取决于其返回类型时,@ ContributesAndroidInjector的行为[重复]

问题描述 投票:0回答:1

此问题已经在这里有了答案:

我有两种配置方法,一种取决于另一种方法提供的对象。下面的代码可以正常工作,该问题在Problem

部分中说明

工作示例

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
    }
}

然后将@Inject的字符串放入Presenter类,并@Inject将该演示者放入CripledFragment。我可以在Presenter中访问Fragment的String参数。实现并不重要,因为它不在问题范围内,不过我可以根据需要添加代码。

问题

合并StringProviderModuleFragmentModule时,IDE抱怨以下消息:“如果没有@Inject构造函数或@Provides注释的方法,将无法提供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文档,找不到任何适当的解释来推断我的问题的原因。非常简单的解释而不是提出解决方案,因为我不是在寻找具体的解决方案。

dagger-2 dagger
1个回答
0
投票

此问题已回答here。基本上,@ContributesAndroidInjector为它为其不驻留的模块(在这种情况下为MainActivity)生成的子组件提供ActivityBinderModule实例。这意味着FragmentModule内部的任何置备方法都可以访问MainActivity的实例。

@Module
abstract class ActivityBinderModule {

    @ContributesAndroidInjector(modules = [FragmentModule::class])
    abstract fun mainActivity(): MainActivity
}
© www.soinside.com 2019 - 2024. All rights reserved.