2017-07-19 13 views
4

を実行する私は私がやったきた私の活動のクラスでダガー2どのようにコンストラクタ・インジェクション

public class DialogUtils 
{ 
    private Context context; 

    @Inject 
    public DialogUtils(Context context) 
    { 
     this.context = context; 
    } 
} 

クラスを持っているが、私はdialogUtilsインスタンスでnullポインタ例外を取得しています。

私はモジュールとコンポーネントを介して依存関係を注入する方法を知っていますが、どのように構築注入を行うかはわかりません。どんな助けも大歓迎です。

答えて

3

あなたは活動レベルのコンポーネントを保持していないと、コンポーネントの依存関係またはサブコンポーネントを使用してスーパースコープ(アプリケーションレベルのコンポーネント)から継承されていない場合、それは次のよう

// unscoped 
public class DialogUtils { 
    private final Context context; 

    @Inject 
    public DialogUtils(Context context) { 
     this.context = context; 
    } 
} 

ですその後、

@Module 
public class ActivityModule {  
    private final Context context; 

    public ActivityModule (Context context) { 
     this.context = context; 
    } 

    @Provides //scope is not necessary for parameters stored within the module 
    public Context context() { 
     return context; 
    } 
} 

@Component(modules={ActivityModule.class}) 
@Singleton 
public interface ActivityComponent { 
    Context context(); 

    DialogUtils dialogUtils(); 

    void inject(MainActivity mainActivity); 
} 

そして

@Inject 
DialogUtils dialogUtils; 

... 


    ActivityComponent activityComponent = DaggerMainActivityComponent.builder() 
     .activityModule(new ActivityModule(MainActivity.this)) 
     .build(); 

    activityComponent.inject(this); // activityComponent.dialogUtils() also works 
+0

ありがとうございます。なぜこれらの2つのメソッドも 'Context context(); | DialogUtils dialogUtils(); 'void inject(MainActivity mainActivity);だけが目的を果たすことができますか? –

+0

あなたのアプローチは、すべての活動のために私は別のコンポーネントと別のモジュールを作る必要があることを示していますか?正しいか何か共通のアプローチを使うことができます –

+0

ダイアログにはアクティビティコンテキストが必要ですが、静的アクティビティコンテキストは保存しないでください。私はそれをもう少し一般的な目的にすることができます。 – EpicPandaForce

2

一方で、あなたはコンストラクタ・インジェクションのためDialogUtilsを登録しているので、いずれかのコンポーネントは、それを提供することができます。

一方の活動とAndroidフレームワークの他の部分は、まだフィールドを注射する必要があります。ダガーでコンストラクタを呼び出すことはできません。@Inject DialogUtils dialogUtils;は魔法のように表示されるだけではありません。

ここでは、コンポーネントを使用し、あなたのコンポーネントが引数として入力取るメソッドを登録する必要があります。 Daggerはアクティビティフィールドを挿入するメソッドを作成します。

@Component MyComponent { 
    inject(LoginActivity activity); 
} 

あなたはまだあなたのコンポーネントを作成する必要がフィールドを注入し、inject(loginActivity)メソッドを呼び出すこと。

void onCreate(...) { 
    MyComponent component = // create the component 

    // dagger does some heavy lifting here 
    component.inject(this); 

    dialogUtils.doSomething(); // not null, we just injected our fields 
} 
+0

答えをありがとう。あなたの例では、 'MyComponent'はDialogUtilsとの関係を表示しません。ですから、 'component.inject(this)'を呼び出すと 'dialogUtils'変数がどのように注入されますか? –

+0

Davidさんは、私の問題の完全なソリューションの例を示してください。また、どのようにでしょうコンストラクタ '@Injectの私のパラメータ 公共DialogUtils(コンテキストコンテキスト) { this.context =コンテキスト。 } 'つまりコンテキストが注入されますか?私のクラスはモジュールではないので、私はどのように提供できますか?コンストラクタインジェクションのみを使用しています。お返事ください –

関連する問題