2016-05-16 10 views
5

私はdaggerを初めて使っています。私のコンストラクタ/メソッドインジェクションは動作していないようです。 注入されたフィールドが依然として要求されていることを意味しません。Android:Dagger 2とコンストラクタインジェクション

これは私のコードです:私は、コンストラクタの上、「@Inject」アノテーションの使用が

@Module 
public class AppContextModule { 

    private final Context appContext; 

    public AppContextModule(Context appContext) { 
     this.appContext = appContext; 
    } 

    @Singleton 
    @Provides 
    public Context getAppContext() { 
     return appContext; 
    } 

} 

@Singleton 
@Component(modules = {AppContextModule.class}) 
public interface MyComponent { 

    void inject(ActivitiesLifeCycleListener obj); 

    void inject(WebViewManager obj); 

    Context context(); 

} 

public final class MyClass { 

    private final WeakReference<Context> mAppContext; 

    @Inject 
    public MyClass(Context context) { 
     this.mAppContext = context 
    } 

} 

public class MyActivity extends BaseActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     MyClass my = new MyClass(); // The IDE requests context! 

    } 

} 

「MyClassのは、」まだ「コンテキスト」を必要とします。 私は何が欠けていますか?

コンテキストを公開する必要がありますか?

ありがとうございました。

+0

インスタンス「MyClass my = new MyClass();」をこのように作成しようとすると、@injectのポイントは何ですか? –

答えて

10

うーん...あなたはあなたのコンストラクタ

public MyClass(Context context) { 
    this.mAppContext = context 
} 

を宣言し、は、あなたが、これは動作するはずだと思いますなぜ、どのパラメータ

MyClass my = new MyClass(); // The IDE requests context! 

せずにそれを呼び出しますか?これは普通のJavaであり、必要な引数は提供されずに新しいオブジェクトを作成しようとしています。


ダガーは、Javaの仕組みを変える魔法ではありません。コンストラクタインジェクションを使用するには、実際にDaggerを使用してフィールドを注入する必要があります。

public class MyActivity extends BaseActivity { 

    @Inject 
    MyClass mMyClass; // mark field for injection 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // todo ... create component 

     component.inject(this); // inject fields 
    } 

} 

短剣が、その後inject —魔法を呼び出すによってMyClassであなたの活動を注入します(そうでない場合は、Context must be provided...コンパイルエラーが発生します)あなたはContextどこかを提供することを考えます。 injectメソッドはオブジェクトを自分のフィールドに割り当てます。


コンストラクタインジェクションとは、モジュールを使用する必要がなく、オブジェクトを提供するメソッドを含むことを意味します。薄い空気から魔法のようにオブジェクトを作成するだけでなく、コンストラクターの動作方法を変更することもありません。

+0

このトピックについて私に助けてくれますか?http://stackoverflow.com/q/43308649/6596724、ありがとう –

+0

モジュールではないクラスのコンポーネントを作成する方法を示していれば素晴らしいでしょう。 –

関連する問題