Estoy usando Dagger 2.24. Cuando compilo lo siguiente

fun main() {
    val myClass = MyClass()
}

class MyClass {
    @Inject
    lateinit var stringMe: String

    init {
        DaggerMyComponent.create().subComponent().inject(this)
        println(stringMe)
    }
}

@Component
interface MyComponent {
    fun subComponent(): MySubcomponent
    fun inject(a: MyClass)
}

@Subcomponent(modules = [MeSubModule::class])
interface MySubcomponent {
    fun inject(a: MyClass)
}

@Module
class MeSubModule {
    @Provides
    fun stringMe(): String = "Hi here"
}

Es un error al afirmar

error: [Dagger/MissingBinding] java.lang.String cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract interface MyComponent {
                ^
  A binding with matching key exists in component: com.elyeproj.modular1bottombase.MySubcomponent
      java.lang.String is injected at
          com.elyeproj.modular1bottombase.MyClass.stringMe
      com.elyeproj.modular1bottombase.MyClass is injected at
          com.elyeproj.modular1bottombase.MyComponent.inject(com.elyeproj.modular1bottombase.MyClass)   

Luego comento la línea simple a continuación, todos compilan bien.

fun main() {
    val myClass = MyClass()
}

class MyClass {
    @Inject
    lateinit var stringMe: String

    init {
        DaggerMyComponent.create().subComponent().inject(this)
        println(stringMe)
    }
}

@Component
interface MyComponent {
    fun subComponent(): MySubcomponent
//    fun inject(a: MyClass)  // Comment this out.
}

@Subcomponent(modules = [MeSubModule::class])
interface MySubcomponent {
    fun inject(a: MyClass)
}

@Module
class MeSubModule {
    @Provides
    fun stringMe(): String = "Hi here"
}

¿Sospecho que es un error de Dagger 2, pero solo escribe aquí en caso de que me pierda algo?

0
Elye 23 oct. 2019 a las 15:12

1 respuesta

La mejor respuesta

Aparentemente, siempre que tengamos inject(a: MyClass) en MyComponent como se muestra a continuación, en el momento de la compilación, intentará verificar que MyComponent sean capaces de satisfacer todas las @Inject dependencias que { {X4}} necesita.

@Component
interface MyComponent {
    fun subComponent(): MySubcomponent
    fun inject(a: MyClass)  // Comment this out.
}

En mi caso anterior, MyClass necesita String, pero MyComponent en sí mismo no tiene la capacidad de proporcionar String. Entonces falla. La compilación de anotaciones actual hace la verificación, y no importa si realmente hay cableado o no.

0
Elye 23 oct. 2019 a las 21:01