Инъекция кинжала не работает для "объекта" в Котлине
Проведя смехотворное количество времени, пытаясь понять, почему мои инъекции кинжала не работают; Я понял, что проблема "объекта" в Котлине была проблемой.
Не удалось выполнить следующее: введенное свойство было 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
Есть ли решение этой проблемы?