¿Cómo se usa @Named con @BindsInstance? tengo este componente
interface AppComponent : AndroidInjector<MyApplication>{ @Component.Builder abstract class Builder : AndroidInjector.Builder<MyApplication>() { @BindsInstance abstract fun preferenceName( @Named("PreferenceName") name : String ) : Builder } }y tratando de inyectar en MyApplication
@Inject @Named("PreferenceName") lateinit var prefName : StringPero falla con MissingBinding for String. Podría resolver esto con un proveedor de módulos pero tratando de evitar el proveedor de constantes.
Actualización: Dagger 2.25.2 ha eliminado la necesidad de una solución alternativa:
Soporte técnico de Kotlin
ii. Las anotaciones de calificadores en los campos ahora se pueden entender sin necesidad de @field:MyQualifier (646e033)
iii. Las clases de objetos @Module ya no necesitan @JvmStatic en los métodos proporcionados. (0da2180)
Esto no tiene nada que ver con @BindsInstance , sino con las anotaciones @Named en los campos. Puede saberlo por "MissingBinding for String", que de lo contrario le daría un error sobre una cadena con nombre.
Como en el artículo de Svetlozar Kostadinov Uso correcto de la anotación Dagger 2 @Named en Kotlin , deberá aclararle a Kotlin que desea que las anotaciones se apliquen al campo.
@field:[Inject Named("PreferenceName")] lateinit var prefName : String;Como dice Svetlozar:
La razón es que en Kotlin las anotaciones deben ser un poco más complicadas para que funcionen como se espera desde la perspectiva de Java. Eso proviene del hecho de que un elemento Kotlin puede ser una fachada de múltiples elementos Java emitidos en el código de bytes. Por ejemplo, una propiedad de Kotlin es una fachada de una variable miembro subyacente de Java, un getter y un setter. Anota la propiedad, pero lo que Dagger espera que se anote es el campo subyacente.
Relacionado: Inyección del constructor Dagger 2 en Kotlin con argumentos con nombre