Инъекция кинжала не работает для "объекта" в Котлине

Проведя смехотворное количество времени, пытаясь понять, почему мои инъекции кинжала не работают; Я понял, что проблема "объекта" в Котлине была проблемой.

Не удалось выполнить следующее: введенное свойство было null.

object SomeSingleton {

    @Inject
    lateinit var property: Property

    init {
        DaggerGraphController.inject(this)
    }
}

Однако, следующий DID работает просто отлично:

class NotSingleton {

    @Inject
    lateinit var property: Property

    init {
        DaggerGraphController.inject(this)
    }
}

Я попробовал Google, я пробовал документацию, но я не мог указать причину этого. Также обратите внимание, что я не пробовал это с JAVA, у JAVA нет концепции создания синглонов в любом случае.

Почему это так? Почему kotlin singleton не может вводить члены, но обычный не-одиночный класс может?

Ответ 1

Если вы посмотрите на байт-код kotlin, вы обнаружите, что код, который вы написали, переводится следующим образом:

public final class SomeSingleton {
    public static LProperty; property // <- Notice static field here

    public final getProperty()LProperty
    ...

    public final setProperty(LProperty)V
    ...
}

Как вы можете видеть, фактическое поле является статическим, что делает его непригодным для инъекций. Вы можете попытаться переместить аннотацию @Inject на метод setter, сделав так:

object SomeSingleton {
    @set:Inject
    lateinit var property: Property
    ...
}

Ответ 2

Я пытался использовать dagger.Lazy<YourClass>, и он работает

 @set:Inject
lateinit var authClient: dagger.Lazy<PlatformAuthClient>

Ответ 3

Есть ли решение этой проблемы?