Dagger2 - Как использовать @Named с @BindsInstance - PullRequest
0 голосов
/ 09 января 2019

Как @Named используется с @BindsInstance? У меня есть этот компонент

interface AppComponent : AndroidInjector<MyApplication>{
    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<MyApplication>() {

        @BindsInstance
        abstract fun preferenceName( @Named("PreferenceName") name : String ) : Builder
    }
}

и пытается ввести в MyApplication

@Inject
@Named("PreferenceName")
lateinit var prefName : String

Но это не работает с MissingBinding for String. Я мог бы решить это с поставщиком модуля, но пытаясь избежать поставщика для констант.

1 Ответ

0 голосов
/ 09 января 2019

Это не имеет ничего общего с @BindsInstance, а с аннотациями @Named на полях. Вы можете узнать из «MissingBinding for String», что в противном случае выдает ошибку об Именованной строке.

Как и в статье Светлозара Костадинова Правильное использование аннотации Dagger 2 @Named в Kotlin , вам необходимо уточнить для Kotlin, что вы хотите, чтобы аннотации применялись к полю.

@field:[Inject Named("PreferenceName")]
lateinit var prefName : String;

Как сказал Светлозар:

Причина в том, что в Kotlin аннотации должны быть немного более сложными, чтобы работать как ожидалось с точки зрения Java. Это связано с тем, что один элемент Kotlin может быть фасадом нескольких элементов Java, излучаемых в байт-коде. Например, свойство Kotlin является фасадом базовой переменной-члена Java, метода получения и установки. Вы аннотируете свойство, но то, что Dagger ожидает аннотировать, является основным полем.

Похожие: Инъекция в конструктор Dagger 2 в kotlin с именованными аргументами

...