Невозможно предоставить квалифицированную строку с помощью Dagger2

Я пытаюсь следовать образцу здесь

Я уже использовал Dagger2 с AndroidInjector успешно, но теперь я экспериментировал с новым DaggerApplication и DaggerAppCompatActivity .

Я получаю сообщение об ошибке:

Ошибка: (5, 1): [dagger.android.AndroidInjector.inject (T)] java.lang.String не может быть предоставлена ​​без конструктора @Inject или из метода @ Provides- или @ Produces-annotated.

Я не думаю, что новые классы кинжалов вызывают проблему. Если я удалю @DeviceModel в BuildModule.kt, компиляция кода.

Любое предложение?

Здесь код:

AppComponent.kt

 @Component(modules = arrayOf( AndroidSupportInjectionModule::class, AppModule::class, MainActivitySubComponent.MainActivityModule::class )) interface AppComponent : AndroidInjector<App> { @Component.Builder abstract class Builder : AndroidInjector.Builder<App>() } 

AppModule.kt

 @Module(subcomponents = arrayOf(MainActivitySubComponent::class)) class AppModule { } 

BuildModule.kt

 @Module class BuildModule { @Provides @DeviceModel fun provideModel(): String { return MODEL } } 

DeviceModel.kt

 @Qualifier @Retention(AnnotationRetention.RUNTIME) @MustBeDocumented annotation class DeviceModel 

MainActivitySubComponent.kt

 @Subcomponent(modules = arrayOf(BuildModule::class)) interface MainActivitySubComponent : AndroidInjector<MainActivity> { @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder<MainActivity>() @Module(subcomponents = arrayOf(MainActivitySubComponent::class)) abstract class MainActivityModule { @Binds @IntoMap @ActivityKey(MainActivity::class) internal abstract fun bind(builder: MainActivitySubComponent.Builder): AndroidInjector.Factory<out Activity> } } 

* MainActivity.kt **

 class MainActivity : DaggerAppCompatActivity() { @Inject @DeviceModel lateinit var model: String override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) Log.d(model, model); } } 

App.kt

 class App : DaggerApplication() { override fun applicationInjector(): AndroidInjector<App> { return DaggerAppComponent.builder().create(this) } } 

Solutions Collecting From Web of "Невозможно предоставить квалифицированную строку с помощью Dagger2"

При использовании кинжала с объектами Котлина мы должны рассмотреть, как Котлин фактически создает свойства в JVM.

 @Inject @DeviceModel lateinit var model: String 

Обладая таким свойством, Kotlin собирает три элемента Java : частное поле поддержки, getter и setter (из-за var а не val ). Без дальнейших подсказок относительно ваших намерений, Котлин помещает вашу аннотацию DeviceModel на геттер.

Решение состоит в том, чтобы указать, что поле должно быть аннотировано с помощью @field:[annotation] .

 @Inject @field:DeviceModel lateinit var model: String 

Вам также может потребоваться использовать @JvmField чтобы сделать поле поддержки открытым для Dagger, что исключает использование lateinit и, конечно же, потребует инициализации String.

 @Inject @field:DeviceModel @JvmField var model: String 

Обратите внимание, что в целом Kotlin достаточно умен, чтобы применять специальные аннотации с @Target(AnnotationTarget.FIELD) к полю резервного @Target(AnnotationTarget.FIELD) , но это помешало бы вам также использовать его на fun providesModel