我已经简化了我的应用程序以找到问题的根源,这里是简化的版本。我正在使用以下配置实现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构造函数或@提供注释的方法
您可能忘记了将应用程序插入MyApp
。您应该有类似的内容(您可能需要对其进行一些修改以适合您的AppComponent
:
DaggerAppComponent.builder()
.application(this)
.build()
.inject(this)
我不明白的是,ContributesAndroidInjector已经提供了MainActivity的实例,为什么Dagger仍会抱怨它。
文档中的ContributesAndroidInjector说:
为此方法的返回类型生成{@link AndroidInjector}。注入器是通过{@link dagger.Subcomponent}实现的,并且是{@link dagger.Module}组件的子代。
因此它不提供MainActivity。为什么您实际上需要它?