Après avoir passé un temps ridicule à essayer de comprendre pourquoi mes injections de poignard ne fonctionnaient pas; J'ai réalisé que le type "objet" de Kotlin était le problème.
Ce qui suit n'a pas fonctionné, la "propriété" injectée était nulle.
object SomeSingleton {
@Inject
lateinit var property: Property
init {
DaggerGraphController.inject(this)
}
}
Cependant, les DID suivants fonctionnent parfaitement:
class NotSingleton {
@Inject
lateinit var property: Property
init {
DaggerGraphController.inject(this)
}
}
J'ai essayé google, j'ai essayé la documentation mais je ne pouvais pas cerner la raison derrière cela. Notez également que je n’ai pas essayé cela avec Java, Java n’a de toute façon pas le concept de singletons intégré.
Pourquoi est-ce le cas? Pourquoi un singleton kotlin est-il incapable d'injecter des membres, mais une classe régulière non singleton peut le faire?
Si vous examinez le bytecode de kotlin, vous constaterez que le code que vous avez écrit est traduit comme suit:
public final class SomeSingleton {
public static LProperty; property // <- Notice static field here
public final getProperty()LProperty
...
public final setProperty(LProperty)V
...
}
Comme vous pouvez le constater, le champ réel est statique, ce qui le rend inéligible pour l'injection d'instance. Vous pouvez essayer de déplacer l'annotation @Inject
sur la méthode de définition en procédant comme suit:
object SomeSingleton {
@set:Inject
lateinit var property: Property
...
}
J'ai essayé d'utiliser dagger.Lazy<YourClass>
et ça marche
@set:Inject
lateinit var authClient: dagger.Lazy<PlatformAuthClient>