碎片和交换模块中的 Dagger 2 注入
Dagger 2 injection in Fragments and swapping Modules
我已经开始使用 Dagger 2,但我不确定在以下复杂情况下我 运行 是否做对了:
假设我有一个用 House
初始化的 HouseModule
和一个用 Window
.
初始化的 WindowModule
现在我有一个 HouseFragment
应该是关于房子的一般信息。
因此我创建了一个 HouseComponent
包括 HouseModule
.
到目前为止一切顺利。
现在 HouseFragment
(ViewPager) 中有多个嵌套的 HouseDetailsFragment
,它们显示有关 House
和 Window
的信息。
我创建了一个 HouseDetailsComponent
包括 HouseModule
和 WindowModule
.
我的依赖图如下所示:
// 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);
我不喜欢父片段和活动所需的知识(和演员表)。
有没有更简单的方法来实现我想做的事情?关于依赖图还有其他建议吗?
另外,如何在 HouseFragment
中显示不同的 House
?我想创建一个新的 HouseModule
然后换掉另一个……但我该怎么做?没有 afaik 访问器。
我一直在使用子模块来简化层次结构。
还有 Dagger 2.11+ supports Android 并使注射更容易。
我已经开始使用 Dagger 2,但我不确定在以下复杂情况下我 运行 是否做对了:
假设我有一个用 House
初始化的 HouseModule
和一个用 Window
.
WindowModule
现在我有一个 HouseFragment
应该是关于房子的一般信息。
因此我创建了一个 HouseComponent
包括 HouseModule
.
到目前为止一切顺利。
现在 HouseFragment
(ViewPager) 中有多个嵌套的 HouseDetailsFragment
,它们显示有关 House
和 Window
的信息。
我创建了一个 HouseDetailsComponent
包括 HouseModule
和 WindowModule
.
我的依赖图如下所示:
// 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);
我不喜欢父片段和活动所需的知识(和演员表)。 有没有更简单的方法来实现我想做的事情?关于依赖图还有其他建议吗?
另外,如何在 HouseFragment
中显示不同的 House
?我想创建一个新的 HouseModule
然后换掉另一个……但我该怎么做?没有 afaik 访问器。
我一直在使用子模块来简化层次结构。
还有 Dagger 2.11+ supports Android 并使注射更容易。