为什么@ContributesAndroidInjector不提供Android框架类型

2023-12-13

我已经简化了我的应用程序以找到问题的根源,这是简化的版本。我正在使用以下配置实现 Dagger 2:

应用组件

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

        fun build(): AppComponent
    }
}

活动绑定模块

@Module
abstract class ActivityBindingModule {
    @ContributesAndroidInjector
    abstract fun mainActivity(): MainActivity

    @Module
    companion object{
        @JvmStatic
        @Provides
        fun provideString(mainActivity: MainActivity): String{
            return "Tent"
        }
    }
}

主要活动

class MainActivity : DaggerAppCompatActivity() {

    @Inject
    lateinit var string: String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        println("meco simplest ${string}")
    }
}

当我运行该应用程序时,出现以下错误。我不明白的是ContributesAndroidInjector已经提供了一个实例MainActivity为什么 Dagger 仍然抱怨它。

如果没有 @Inject 构造函数或 @Provides注解的方法

EDIT对于@yavor

保持所有类原样并分开活动绑定模块实现为两个类。现在您可以看到该实例MainActivity提供了,Dagger 并没有抱怨它。活动绑定模块

@Module
abstract class ActivityBindingModule {
    @ContributesAndroidInjector(modulese [StringProviderModule::class])
    abstract fun mainActivity(): MainActivity
}

字符串提供者模块

@Module
class StringProviderModule {
    @Module
    companion object{
        @JvmStatic
        @Provides
        fun provideString(mainActivity: MainActivity): String{
            return "Tent"
        }
    }
}

我不明白的是 ContributesAndroidInjector 已经提供了 MainActivity 的实例,为什么 Dagger 仍然抱怨它。

ContributesAndroidInjector 在文档中说:

为此方法的返回类型生成一个 {@link AndroidInjector}。注入器是通过 {@link dagger.Subcomponent} 实现的,并且将是 {@link dagger.Module} 组件的子组件。

所以它不提供MainActivity。

为什么你实际上需要它?我看到您将其作为参数传递给函数:

有趣的提供字符串(mainActivity:MainActivity)

但你真的需要它吗?一般来说,您应该在 MainActivity 中注入依赖项。 MainActivity 应该使用它们。如果两者(MainActivity 和字符串)彼此了解,那么首先,这不是一个好的设计,其次:您即将创建 Dagger 2 不支持的循环依赖关系并引发异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么@ContributesAndroidInjector不提供Android框架类型 的相关文章

随机推荐