2016-05-27 77 views
2

ApplicationComponent.javaDagger2子組件模塊覆蓋

@Component(modules = SomeModule.class) 
@ApplicationScope 
public interface ApplicationComponent { 
    // stuff 
    ActivityComponent activityComponent(); 
} 

ActivityComponent.java

@Subcomponent(modules = AnotherModule.class) 
@ActivityScope 
public interface ActivityComponent { 
    // stuff 
    void inject(MainActivity mainActivity); 
} 

SomeModule可以使用類似this被重寫。但AnotherModule怎麼樣?

一個解決方案是將這兩個組件分開,但是如果我想重新使用父項的某些綁定呢?

編輯:

MainActivity.java

onCreate(Bundle bundle) { 
    getApplicationComponent().getActivityComponent().inject(this); 
} 

EDIT2:

ActivityRyle.java

init() { 
    application.setComponent(DaggerApplicationComponent.builder() 
        .someModule(new TestSomeModule(application)) 
        .build(); 
} 

EDIT3:我試圖避免Application接線太多的東西(其中主組件被創建)。

+0

請始終包含與您的問題相關的所有內容,並且不要只鏈接到外部樣本。 –

回答

0

你也只是重寫模塊。

請記住,你如何創建子:

public interface ApplicationComponent { 

    ActivityComponent activityComponent(/*needed modules go here*/); 
} 

所以,除非你有沒有參數的構造爲模塊,你必須把它們作爲方法聲明中的參數。

如果您希望能夠覆蓋一個無參數的構造模塊,你必須將它們添加到您的方法簽名:

public interface ApplicationComponent { 

    ActivityComponent activityComponent(AnotherModule module); 
} 

並在您的測試,你只需提供你的子類。

+1

使用示例代碼更新瞭如何使用ActivityComponent。在測試中,我將如何通過測試模塊?對於ApplicationComponent,它可以在ActivityTestRule中完成,並將組件設置爲當前的應用程序。但我無法找到一種方法來爲子組件做這樣的事情。 – mbmc

1

您需要將模塊聲明爲子組件工廠方法的輸入參數。

+0

我在哪裏/如何通過測試模塊? – mbmc

+0

不是'ActivityComponent activityComponent();'write'ActivityComponent activityComponent(AnotherModule anotherModule)' – EpicPandaForce

+0

是的,我得到那部分內容,但是從測試中,如何將測試模塊分配給該組件,以便活動正在使用它?在主應用程序中添加一個'setActivityComponent'? – mbmc