Dagger 2-为什么@ContributesAndroidInjector不提供Android Framework类型

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

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

AppComponent

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

        fun build(): AppComponent
    }
}

ActivityBindingModule

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

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

MainActivity

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仍然对此有所抱怨。

MainActivity如果没有@Inject构造函数或@提供注释的方法

dagger-2 dagger
2个回答
0
投票

您可能忘记了将应用程序插入MyApp。您应该有类似的内容(您可能需要对其进行一些修改以适合您的AppComponent

DaggerAppComponent.builder()
    .application(this)
    .build()
    .inject(this)

0
投票

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

文档中的ContributesAndroidInjector说:

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

因此它不提供MainActivity。为什么您实际上需要它?

© www.soinside.com 2019 - 2024. All rights reserved.