Intereting Posts
Использование RxJava для получения отличного результата с помощью Realm и Retrofit Как я получаю HandlerMethod соответствует HttpServletRequest в фильтре Исключение Null Pointer, работающее с Map (Kotlin) Как акцептор может добавить значение в состояние и отправить обратно инициатору Используя Kovenant от Kotlin, я продолжаю использовать повторяющийся код, используя Deferred Как настроить проект eclipse для использования Kotlin с JPA / Hibernate? IntelliJ IDEA с использованием JavaScript-версии зависимости, указанной в файле сборки Gradle? Как написать функции расширения в Котлин? Почему экземпляр $ MockitoMock $ не идентифицируется как макет? Как сбросить FrameLayout или удалить кеш макета Как открыть ссылки, не связанные с URL веб-браузера в браузере из приложения Настройте проект Spring Boot с Kotlin Не может быть возврата внутри Runnable SAM в Котлин? Грейд занимает время спереди, казалось бы, ничего не делает Прочитайте текстовый объект (текстовый файл из папки с данными) в виде строки в Kotlin (Android)

Невозможно предоставить квалифицированную строку с помощью 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