【问题标题】:Dagger2 - should an activity component be a sub-component of other?Dagger2 - 一个活动组件应该是其他的子组件吗?
【发布时间】:2017-03-28 14:07:56
【问题描述】:

我使用@subcomponent 主要用于情况活动需要使用应用程序组件中的一些共享对象,或者片段组件想要使用容器活动提供的一些对象。

现在我想知道是否可以让一些活动组件成为另一个活动组件的subcomponent。比如TaskDetailActivity有一个task对象,想提供给一些其他的activity比如TaskParticipantActivityTaskProgressActivity和一些fragments。

将任务对象提供给其他活动的传统方式是将其设置为intent对象,但是如果我们想在这种情况下使用Dagger2呢?

更新:我的情况与本文http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/中的UserScope的情况类似,但是我可以将用户组件保存在Application类中,而不是保存在活动中,即TaskDetailActivity

【问题讨论】:

  • 当 Android 销毁并重新创建 Activity 时,您能否围绕它重新创建上下文?
  • 有趣的问题@JeffBowman,我认为如果使用 dagger 模块,所有依赖项都将在作用域内注入与以前相同的实例。

标签: dagger-2


【解决方案1】:

组件用于对具有相似生命周期的对象进行分组。虽然组件可能碰巧对应于一组特定的功能(例如用于注入 TaskActivityTaskComponentTaskPresenter),但坚持每组功能只使用一个组件并不总是可能或可取的(例如, 对于所有与任务相关的活动和依赖项,坚持只有一个TaskComponent)。

相反,在 Dagger 2 中,可通过模块获得可重用性,您可以非常轻松地换入和换出组件。在Dagger 2 official documentation 中为可测试性组织模块的建议的限制内,您可以组织与您的功能一致的模块(例如,TaskModule 用于与所有任务相关的依赖项)。然后,由于组件非常轻量级,您可以制作任意数量的组件来处理活动的不同生命周期等等。还请记住,您可以使用 Module @interface 中的 Class<?> [] includes() 方法编写模块。

在您的特定场景中,您希望从TaskDetailActivity 共享Task 对象。如果您在TaskDetailActivity 中持有对Task 的引用,那么当TaskDetailActivity 被销毁时,该引用将不再可用。虽然您可以尝试一些解决方案,将 Task 绑定到模块中,然后在应用程序范围级别维护对该模块的引用,但您基本上会在应用程序范围级别执行与 UserScope 相同的操作您链接的文章。任何使用 Dagger 2 在 Activity 之间共享 Task 对象的解决方案都必然涉及在应用范围级别维护对对象的引用。

使用 Dagger 2 并不意味着 new 关键字或 Parcelables 的序列化/反序列化现在是错误的,因此如果您的第一直觉是使用 Intent 进行通信,那么我会说您是对的。如果您需要比直接传递Task 更强大的解决方案,那么您可以提取TaskRepository 并在包含您希望检索的Taskid 的Activity 之间传输Intent。确实,有些Google Android Architecture Blueprints 有这样的解决方案。

【讨论】:

  • 感谢您非常详细的描述。我最终决定在我标记的链接上将我的任务组件保留在类似UserComponent 的应用程序实例中。
  • @NguyenMinhBinh 我很高兴它有帮助。感谢您的接受
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2018-07-05
相关资源
最近更新 更多