碎片中的Dagger 2注入和交换模块

时间:2016-08-08 17:40:20

标签: android dagger-2

我已经开始使用Dagger 2而且我不确定我是否正确处理以下并发症:

我们假设HouseModule初始化为HouseWindowModule初始化为Window

现在我有HouseFragment这应该是有关房子的一般信息。 因此,我创建了HouseComponent,其中包含HouseModule

到目前为止一切顺利。 现在,HouseDetailsFragment(ViewPager)中有多个嵌套HouseFragment,其中显示有关HouseWindow的信息。 我创建了一个HouseDetailsComponent,其中包括HouseModuleWindowModule

我的依赖关系图如下所示:

// provides application wide dependencies (Application context, SharedPref, Repository,...)
@Component(modules = {ApplicationModule.class}) 
public interface ApplicationComponent { 

}

// provides general activity dependencies (Navigator,... )
@Component(dependencies = ApplicationComponent, modules = {ActivityComponent.class}) 
public interface ActivityComponent{
    void inject(MainActivity mainActivity); 
}

// provides house fragment specific dependencies (HousePresenter,...)
@Component(dependencies = ApplicationComponent, modules = {ActivityComponent.class, HouseComponent.class}) 
public interface HouseComponent extends ActivityComponent {
    void inject(HouseFragment fragment);  
}

// provides house details fragment specific dependencies (HouseDetailsPresenter,...)
@Component(dependencies = ApplicationComponent, modules = {ActivityComponent.class, HouseComponent.class, WindowComponent.class}) 
public interface HouseDetailsComponent extends ActivityComponent {
     void inject(HouseDetailsFragment detailsFragment);  
}

组件创建变得越来越复杂,我想知道如何将依赖关系注入HouseFragment,尤其是HouseDetailsFragment。 例如建立HouseDetailsComponent我必须做以下事情:

// casting omitted
DaggerHouseDetailsComponent.builder()
.applicationComponent(getActivity().getApplication().getApplicationComponent())
.activityModule(getActivity().getActivityModule())
.houseModule(getParentFragment().getHouseModule())
.windowModule(new WindowModule(window)).build().inject(this);

我不喜欢父片段和活动所需的知识(和演员)。 有没有更简单的方法来实现我想做的事情?有关依赖图的任何其他建议吗?

另外,如何在House中显示不同的HouseFragment?我想创建一个新的HouseModule,然后交换另一个......但我该怎么做? afaik没有访问者。

1 个答案:

答案 0 :(得分:0)

我一直在使用子模块来简化层次结构。

同样Dagger 2.11+ supports Android并为其注射更容易。