2016-05-16 68 views
5

我是新來的匕首,我的構造函數/方法注入似乎不工作。 不起作用,意味着仍然要求注入字段。Android:匕首2和構造函數注入

這是我的代碼:

@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的」仍然需要「上下文」雖然我使用了構造上面的「@Inject」的註釋。 我錯過了什麼?

我甚至需要暴露我的上下文嗎?

感謝。

+0

如果你打算創建MyClass my = new MyClass();'這樣的話,@inject有什麼意義? –

回答

10

嗯......你宣佈你的構造

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

然後調用它不帶任何參數

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

爲什麼你認爲這應該工作?這是純java,不涉及匕首,並且您正在嘗試創建一些新對象而不提供所需的參數。


Dagger並沒有改變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 
    } 

} 

既然你提供一個Context地方(你會得到一個Context must be provided...編譯錯誤,如果它是不是),那麼匕首將調用inject —沒有神奇的注入與MyClass您的活動。 inject方法會將對象分配給您的字段。


構造函數注入只意味着你不必使用一個模塊,幷包含一個方法來提供對象。它不僅僅是通過神奇的方式創造出令人難以置信的對象,或者改變建設者的工作方式。

+0

你能幫我關於這個話題嗎?http://stackoverflow.com/q/43308649/6596724,謝謝 –

+0

如果你已經展示瞭如何製作一個不是模塊的類的組件, –