web-dev-qa-db-fra.com

L'injection de dague ne fonctionne pas pour "objet" dans Kotlin

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?

9
Nihilanth

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
    ...
}
9
SimY4

J'ai essayé d'utiliser dagger.Lazy<YourClass> et ça marche

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