2016-05-23 14 views
0

ダガー2の新機能です。thisの基本的なサンプルを少し修正して動作させようとしています。ダガー2依存性注入が機能しない

これは私がこれまで持っているものです。

Componentクラス

@Component(modules = {MyModule.class}) 
public interface MyComponent { 
void inject(Object object); 
} 

Moduleクラス

@Module 
public class MyModule { 

@Provides 
@Singleton 
public Retrofit getRetrofit(){ 
    return new Retrofit(); 
} 
} 

静的インジェクター

public class MyStaticInjector { 

private static MyComponent di; 

public static void inject(Object object){ 
    if(di == null){ 
     di = DaggerMyComponent.builder().build(); 
    } 
    di.inject(object); 
} 
} 

問題は、私は

MyStaticInjector.inject(this); 

を行うたび注釈付きのフィールドはまだヌルであるということです。私は問題がインターフェイスメソッドの型オブジェクトであると思われる。この例では、代わりにアクティビティがあります。しかし、私はアクティビティではないクラスでDIを使用する必要があります。

誰でも手伝ってもらえますか?ありがとうございました。

+0

'Object'には' @ Inject'アノテーション付きフィールドがありません。したがって注入はうまくいく。それは注入するものは何もありません。 'Object'の代わりに実際のクラスを使わなければならないので、コードを生成してフィールドを注入することができます。 –

+0

私は参照してください...ジェネリック注射器メソッドを作る方法はありますか?または、私はインターフェイスのインジェクションクラスごとにメソッドをインジェクションするオーバーロードを持っていますか? – Aurasphere

+0

Daggerはコンパイル時にソースコードを生成します*。クラスについて知らない場合は、そのクラスのコードを作成することはできません。あなたはいくつかのチュートリアルを読んで、短剣についてもっと学びましょう。特にコンストラクタインジェクションを見てください。 –

答えて

2

Objectには、@Injectの注釈付きフィールドはありません。したがって、注入はちょうどうまく動作します—それはちょうど注入するものがありません。
Objectの代わりにinject(MyClass)の実際のクラスを使用すると、コードを生成してフィールドを注入できます。

ダガーはコンパイル時にソースコードを生成します。実際のクラスについて知らない場合は、そのクラスのコードを作成することはできません。

+2

具体的には、https://google.github.io/dagger/api/latest/dagger/Component.htmlの「共分散に関する注意」を参照してください。 – gk5885

関連する問題