Я упростил свое приложение, чтобы получить корень проблемы, и вот упрощенная версия. Я реализую 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 "Tent"
}
}
}
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
причину, по которой Даггер все еще жалуется на это.
MainActivity не может быть предоставлена без конструктора @Inject или аннотации @ Provides-annotatedМетод
РЕДАКТИРОВАТЬ для @ yavor
Сохранить все классы как есть и разделить реализацию ActivityBindingModule на два класса. Теперь вы можете видеть, что экземпляр MainActivity
предоставлен, и Кинжал не жалуется на это. ActivityBindingModule
@Module
abstract class ActivityBindingModule {
@ContributesAndroidInjector(modulese [StringProviderModule::class])
abstract fun mainActivity(): MainActivity
}
StringProviderModule
@Module
class StringProviderModule {
@Module
companion object{
@JvmStatic
@Provides
fun provideString(mainActivity: MainActivity): String{
return "Tent"
}
}
}