带有Dagger 2的Android MVP - 具有多个片段的活动

时间:2016-10-20 03:31:38

标签: android mvp dagger-2

我一直在使用Dagger 2查看适用于MVP的Google Android架构示例:

https://github.com/googlesamples/android-architecture/blob/todo-mvp-dagger/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksActivity.java

但是,这个例子相当简单 - 每个Activity只有一个Fragment,Dagger Component在Activity中构建,用于将片段的Presenter注入Activity。

我已尝试构建该示例,将多个片段添加到Activity并在它们之间导航。由于每个片段都有自己的演示者,我已将匕首组件构建移动到片段中。所以现在我有:

  • FragmentCallback(提供加载fragment1和fragment2的方法的接口)
  • Activity(实现FragmentCallback)
  • Fragment1(实现视图界面)
  • Fragment1Contract(定义视图和演示者界面)
  • Fragment1Presenter(实现演示者界面)
  • Fragment1Component(注入Fragment1)
  • Fragment1Module(提供视图和演示者)
  • Fragment2
  • Fragment2Contract(定义视图和演示者界面)
  • Fragment2Presenter(实现演示者界面)
  • Fragment2Component(注入Fragment2)
  • Fragment2Module(提供视图和演示者)

活动很少,只是加载第一个片段并实现FragmentCallback,视图可以用来切换到另一个片段。

第一个片段有一个按钮,它使用FragmentCallback加载第二个片段 - 片段通过转换活动来获取

public void onAttach(Context context) {
    super.onAttach(context);
    callback = (FragmentCallback) context;
}

我在这里是否合情合理?虽然使用MVP代码看起来很干净但我遗漏了匕首组件和模块的东西吗?

感谢。

更新

我通过为Activity创建一个组件和模块来改善我的状况。每个Fragment仍构建Dagger上下文,但我不再在presenter构造函数中注入视图(片段) - 当片段构建上下文时,注入自身(因此它具有演示者)然后调用{{1}所以演示者现在有了视图。

这很好地减少了类的数量,下一步是尝试仅在活动中构建组件,并让片段使用它来注入自身(无需构建新组件)。

1 个答案:

答案 0 :(得分:0)

你肯定是在正确的轨道上。

我建议您不要在Activity中使用单个组件,而是每Fragment个实例化一个单独的组件(即使组件相同)。这种方法有两个好处:

  • 片段未通过组件本身(以及组件在使用范围时可以缓存的对象)与Activity和其他Fragments耦合。
  • 允许更细粒度地使用示波器(如果您需要)

<强> Offtopic:

我写了一篇关于why activities in Android are not UI elements的博文。看看,如果你觉得它有意义,那么有一个链接到MVP的替代实现:)