我一直在查看使用Dagger 2的MVP的Google Android架构示例:
但是,这个例子相当简单 - 每个Activity只有一个Fragment,并且Dagger Component在Activity中构建,在Fragment中使用它来为Fragment注入Presenter。我尝试构建这个示例,向其中添加多个Fragment并在它们之间导航。由于每个Fragment都有自己的Presenter,因此我将Dagger Component的构建移至Fragment中。现在我有: - FragmentCallback(提供加载fragment1和fragment2方法的接口) - Activity(实现FragmentCallback) - Fragment1(实现视图接口) - Fragment1Contract(定义视图和Presenter接口) - Fragment1Presenter(实现Presenter接口) - Fragment1Component(注入Fragment1) - Fragment1Module(提供视图和Presenter) - Fragment2 - Fragment2Contract(定义视图和Presenter接口) - Fragment2Presenter(实现Presenter接口) - Fragment2Component(注入Fragment2) - Fragment2Module(提供视图和Presenter)Activity几乎什么也不做,只是加载第一个Fragment并实现FragmentCallback接口,这样视图就可以使用它来切换到另一个Fragment。
第一个片段有一个按钮,使用 FragmentCallback 加载第二个片段 - 片段通过将 Activity 强制转换获得 FragmentCallback。
public void onAttach(Context context) {
super.onAttach(context);
callback = (FragmentCallback) context;
}
我这样做是否合理?虽然使用MVP使代码看起来很清晰,但关于dagger组件和模块方面,我是否遗漏了什么?
谢谢。
更新
我通过为活动创建一个组件和模块来改善了我的情况。每个片段仍然构建Dagger上下文,但我不再在Presenter构造函数中注入视图(片段)。当片段构建上下文并注入自身(以便具有Presenter)时,它会调用
presenter.init(this)
,以使Presenter现在具有视图。这样可以很好地减少类的数量,下一步将尝试仅在活动中构建组件,并使片段使用此组件来注入自身(无需构建新组件)。