dagger-2 - 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
}
}
然后@Inject
ing String 到Presenter
class 和@Inject
ing 那个演示者到CripledFragment
. 我可以在 Presenter 中访问 Fragment 的 String 参数。实现并不重要,因为它超出了问题的范围,不过,如果需要,我可以添加代码。
问题
合并StringProviderModule和FragmentModule时,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"
}
}
}
我检查了多个教程和匕首文档,找不到任何适当的解释来推断我的问题的原因。非常感谢简单的解释而不是建议解决方案,因为我不是在寻找具体的解决方案。
解决方案
这个问题已经在这里回答了。基本上,它为它生成的子组件@ContributesAndroidInjector
提供实例,而不是为它所在的模块(在这种情况下)提供实例。这意味着内部的任何提供方法都可以访问's 实例。MainActivity
ActivityBinderModule
FragmentModule
MainActivity
@Module
abstract class ActivityBinderModule {
@ContributesAndroidInjector(modules = [FragmentModule::class])
abstract fun mainActivity(): MainActivity
}
推荐阅读
- apache-spark - 在 pyspark 中使用 when 语句 - 当我添加到脚本的各个部分时不起作用
- reactjs - 在 Apollo Mutation 中调用 Meteor 方法
- google-cloud-platform - 通过 Dataflow 管道写入 Cloud SQL 非常慢
- if-statement - rpm 有条件的子字符串?
- c++ - 如何在 Visual C++ 中使用仅标头库?
- javascript - 为什么 Jquery onclick 监听器不起作用?
- html - 图像宽度被其他东西覆盖
- spring-boot - Jackson Object Mapper 在提供扩展配置时不工作,但在 Spring Boot 中提供类级别/字段级别注释时工作
- ansible - 使用 Ansible 将启动磁盘(如果存在)附加到 Gcloud 实例
- python - Kivy 数字时钟问题