2014-05-02 36 views
1

開始向我的應用程序中引入Dagger,並且在初始化非常基本的字段時遇到問題。下面是我的代碼的簡化版本:使用匕首未在Android中初始化注入字段

@Inject public DaggerUtils daggerUtils; 

public class AppState extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 

     // Set up Dagger 
     AppModule appModule = new AppModule(); 
     mObjectGraph.create(appModule); 

     daggerUtils.print(); 
    } 
} 

模塊:

@Module(
     injects = { AppState.class} 
) 
public class AppModule { 

    // This provides method is commented out because from what I can understand from the Dagger documentation 
    // Dagger should automatically take care of calling the constructor I have provided 
    // with the @Inject annotation. I have tried commenting this out as well and it still 
    // fails. 
    //@Provides 
    //DaggerUtils provideDaggerUtils() { 
    // return new DaggerUtils(); 
    //} 
} 

基本的Util類:

public class DaggerUtils { 

    @Inject 
    public DaggerUtils() { 

    } 

    public void print(){ 
     Logger.e("Dagger", "printed instantiated"); 
    } 
} 

所以從我個人理解,因爲我之前的@Inject註解DaggerUtils構造函數和我在AppState類中使用的DaggerUtils實例之前的@Inject註解,Dagger應該照顧初始化DaggerUtils實例,而不必調用構造函數。然而,當我嘗試調用daggerUtils.print()(AppState類中的第12行)時,它總是給我一個NullPointerException。爲什麼匕首不初始化DaggerUtils?我覺得我在這裏錯過了一些非常基本的東西。我也試着用AppModule中註釋掉的@Provides方法來提供一個實例化的DaggerUtils,但它仍然不起作用。

回答

2

我今天晚上有同樣的問題。

對於每一個類,誰需要注射必須調用:

mObjectGraph.create(appModule).inject(this); 

也就是說有用的應用程序中創建注入方法。

public void inject(Object object) { 
    mObjectGraph.inject(object); 
} 
+0

好的,有效的。我仍然有點困惑。調用mObjectGraph.create(appModule).inject(this)並在模塊中使用injects = {MyClass.class}之間有什麼區別? – odiggity

+0

injects = {MyClass.class}就像聲明一樣,appModule會注入這個類。如果在沒有聲明的情況下調用mObjectGraph.create(appModule).inject(this),則會發生異常 – Daggeto