Кинжал 2: Отсутствует поставщик, когда родитель и ребенок имеют одинаковую инъекцию? - PullRequest
0 голосов
/ 23 октября 2019

Я использую Dagger 2.24. Когда я компилирую ниже

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"
}

Это выдает ошибку с указанием

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)   

Затем я закомментирую простую строку ниже, все скомпилируется нормально.

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"
}

Подозреваюэто ошибка в Dagger 2, но просто напишите здесь на случай, если я что-то пропущу?

1 Ответ

0 голосов
/ 24 октября 2019

Очевидно, что пока у нас есть inject(a: MyClass) в MyComponent, как показано ниже, во время компиляции он будет пытаться проверить, что MyComponent в состоянии удовлетворить все @Inject зависимости, которые нужны MyClass.

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

В моем случае выше, MyClass требуется String, но сам MyComponent не может предоставить String. Так что не получается. Текущая компиляция аннотаций выполняет проверку, и не имеет значения, действительно ли подключено или нет.

...