2015-11-19 249 views
0

我檢查了所有問題,但沒有發現任何線索。我剝奪了我的問題,以一個簡單的代碼:匕首2不注入依賴模塊

情況: 我想有:

CatComponent catComponent = DaggerCatComponent.builder() 
     .kameModule(new KameModule(MainActivity.this)) 
     .build(); 
    catComponent.getCatAnalyzer().analyze(); 

我已經創建的組件:

@Component(modules = {KameModule.class, CatAnalyzerModule.class}) 
public interface CatComponent { 

    CatAnalyzer getCatAnalyzer(); 
} 

和模塊:

@Module 
public class KameModule { 

    private Context context; 

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

    @Provides 
    KameCat provideKameCat() { 
     return new KameCat(context); 
    } 
} 

@Module(includes = KameModule.class) 
public class CatAnalyzerModule { 

    @Inject 
    KameCat cat; 

    @Provides 
    CatAnalyzer provideCatAnalyzer() { 
     return new CatAnalyzer(cat); 
    } 
} 

和類:

public class KameCat { 

    Context context; 

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

    public void doCatStuff() { 
     Toast.makeText(context, "Poo and Meow", Toast.LENGTH_LONG).show(); 
    } 
} 

public class CatAnalyzer { 

    @Inject 
    KameCat cat; 

    @Inject 
    public CatAnalyzer(KameCat cat) { 
     this.cat = cat; 
    } 

    void analyze() { 
     cat.doCatStuff(); 
    } 
} 

當我從CatComponent找回我的CatAnalyzer對象有cat清零。 我不知道爲什麼Dagger不會注入它。你能指導我嗎?

回答

2

正確代碼:

@Module(includes = KameModule.class) 
public class CatAnalyzerModule { 

    @Inject //remove this 
    KameCat cat;// remove this 

    @Provides 
    // Add cat as a argument and let KameModule provide it.. 
    CatAnalyzer provideCatAnalyzer(KameCat cat) { 
     return new CatAnalyzer(cat); 
    } 
} 

感謝:因爲在`CatAnalyzerModule`所提供的類 https://www.future-processing.pl/blog/dependency-injection-with-dagger-2/

+0

你'@ Inject'註解的是多餘的。你可以從模板中刪除模塊,或者在構造函數中使用@Inject註解。無論哪種方式,「KameCat貓」上的「@ Inject」註釋都是多餘的。 – rdshapiro

+0

此外,對於更多習慣性的DependencyInjection,「KameModule」將提供上下文,以便它可以參與任何模塊中的任何地方。然後,'provideKameCat'方法也可以使用'Context'作爲參數,類似於你使用'provideCatAnalyzer(KameCat cat)'做的事情' – rdshapiro

+0

'最後,如果你結束,'@ Module.includes'不是必須的包括兩個模塊在'@ Component.modules'列表中。 – rdshapiro