我有两种配置方法,一种取决于另一种方法提供的对象。下面的代码可以正常工作,该问题在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参数。实现并不重要,因为它不在问题范围内,不过我可以根据需要添加代码。
问题
合并StringProviderModule和FragmentModule时,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文档,找不到任何适当的解释来推断我的问题的原因。非常简单的解释而不是提出解决方案,因为我不是在寻找具体的解决方案。
此问题已回答here。基本上,@ContributesAndroidInjector
为它为其不驻留的模块(在这种情况下为MainActivity
)生成的子组件提供ActivityBinderModule
实例。这意味着FragmentModule
内部的任何置备方法都可以访问MainActivity
的实例。
@Module
abstract class ActivityBinderModule {
@ContributesAndroidInjector(modules = [FragmentModule::class])
abstract fun mainActivity(): MainActivity
}