私の短剣の注射がうまくいかなかった理由を解明しようと途方もない時間を費やした後。 Kotlinの「オブジェクト」タイプが問題であることに気付きました。
以下は機能しませんでした。注入された「プロパティ」はnullでした。
object SomeSingleton {
@Inject
lateinit var property: Property
init {
DaggerGraphController.inject(this)
}
}
ただし、次のDIDは正常に機能します。
class NotSingleton {
@Inject
lateinit var property: Property
init {
DaggerGraphController.inject(this)
}
}
私はグーグルを試しました、私はドキュメントを試しました、しかし私はこれの背後にある理由を特定できませんでした。また、私はこれをJavaで試したことがないことに注意してください。Javaには、とにかく組み込まれたシングルトンの概念がありません。
これはなぜですか? Kotlinシングルトンがメンバーを注入できないのに、通常の非シングルトンクラスはできるのはなぜですか?
Kotlinバイトコードを調べると、記述したコードが次のように翻訳されていることがわかります。
public final class SomeSingleton {
public static LProperty; property // <- Notice static field here
public final getProperty()LProperty
...
public final setProperty(LProperty)V
...
}
あなたが見ることができるように、実際のフィールドは静的であり、インスタンスの注入には不適格です。あなたは移動しようとするかもしれません@Inject
アノテーションをセッターメソッドに追加する:
object SomeSingleton {
@set:Inject
lateinit var property: Property
...
}
dagger.Lazy<YourClass>
を使用しようとしましたが、機能します
@set:Inject
lateinit var authClient: dagger.Lazy<PlatformAuthClient>
それでも@Singleton
オブジェクト定義の上にあるデコレータ。そのデコレータはクラスを「シングルトン」にするわけではなく、Daggerがすべての依存関係を同じ場所で取得するために使用するだけです。