2015-04-26 19 views
2

我正在嘗試將Dagger 2添加到我的Android項目中。我想我理解到構建圖表的位置。那時我在黑暗中拍攝,那是我出錯的地方。
所有內容都會編譯,但運行時注入的字段爲空。無法使用匕首2注入職業

我試圖簡單地通過注入Presenter到我的MainActivity。我寫了下面的代碼,並希望得到一些幫助,找出我出錯的地方。

我PresenterModule.java:

@Module 
public class PresenterModule { 

    @Provides MainActivityPresenter providesMainActivityPresenter() { 
    return new DefaultMainActivityPresenter(); 
    } 
} 

我的應用程序類,也包括我的組件繼Dagger2示例代碼:

public class App extends Application { 

    private PresenterComponent component; 

    @Singleton 
    @Component(modules = PresenterModule.class) 
    public interface PresenterComponent { 
    void inject(App app); 
    void inject(MainActivity activity); 
    } 


    @Override public void onCreate() { 
    Log.d("App.java", "Starting Application"); 
    super.onCreate(); 

    component = DaggerApp_PresenterComponent.builder() 
     .presenterModule(new PresenterModule()) 
     .build(); 
    component.inject(this); 
    } 

    public PresenterComponent component() { 
    return component; 
    } 
} 

最後我MainActivity。

public class DefaultMainActivity 
    extends ActionBarActivity 
    implements MainActivity 
{ 
    @Inject MainActivityPresenter mPresenter; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ((App)getApplication()).component().inject(this); 

    mPresenter.getCurrentDetailLineNumber(); 
    setContentView(R.layout.base_layout); 

    getSupportActionBar(); 

    mContainer = (Container) findViewById(R.id.container); 
    mPresenter.requestCurrentScreen(); 
    } 

被注入實際的對象是一個接口的實現,但其他明智的一個POJO對象:

public class DefaultMainActivityPresenter implements MainActivityPresenter { 

    private static final int SCREEN_BROWSER = 0; 
    private static final int SCREEN_DETAIL = 1; 

    LineNumber mCurrentDetailLineNumber; 
    int mCurrentScreen; 

    @Inject 
    public DefaultMainActivityPresenter() { 
    } 
    ... 
} 
+1

你不說什麼錯誤是,編譯時鍵入?空指針? ... – Blundell

+0

對不起,注入的變量在運行時爲null。一切都很好。 – MrWizard54

回答

6

更改PresenterComponent到下面將解決您的問題:

@Singleton 
    @Component(modules = PresenterModule.class) 
    public interface PresenterComponent { 
    void inject(App app); 
    void inject(DefaultMainActivity activity); 
    } 

這是由協方差造成的: 雖然類型的成員注入方法將接受其子類型的實例,但只有參數的Inject註釋成員類型爲d它的超類型將被注入;亞型成員不會。例如,給定以下類型中,只有A和B將被注入時,它被傳遞給會員,注射法injectSelf(self實例)兒童的一個實例:

class Parent { 
    @Inject A a; 
    } 

    class Self extends Parent { 
    @Inject B b; 
    } 

    class Child extends Self { 
    @Inject C c; 
    } 
+1

是否每個需要注入變量的類都需要在組件中使用inject()調用? – MrWizard54

+2

不幸的是,是的。但是,注入方法會將所有成員初始化爲繼承鏈。 –