首页 > 解决方案 > 如何使用 Dagger Android 创建自定义范围并共享相同的实例

问题描述

所以这是我从文档中知道的事情

  1. 引擎盖下的 Dagger Android 正在为每个带有注释的 Activity 创建子组件ContributesAndroidInjector
  2. 您可以将自定义范围应用于ContributesAndroidInjector注释到的方法
  3. 如果两个同级子组件具有相同的作用域,它们仍将具有不同的作用域实例
  4. 如果 Activity 在子组件中,它可以有自己的子组件,其中可以包含 Fragments。这些 Fragments 将共享 Activity 具有的作用域实例。

现在我的问题是:如何使用 Dagger Android 让一个 Activity 成为另一个 Activity 的子组件?

我想这样做是因为我想实现@UserScope/@SessionScope 之类的东西。

由此我知道我可以只用 Dagger 而不是 Dagger Android 来做到这一点但是使用Dagger Android,你只能让Application(也就是AndroidInjector)来注入Activity。您不能将 Activity 用作父子组件的持有者或宿主来注入另一个 Activity。

我理解正确吗?

2018 年 5 月 14 日更新:

我最终摆脱了 Dagger Android。所以没有更多ContributesAndroidInjector,只是纯粹的匕首。为了注入 Activity/Fragment,我使用这里推荐的方式。它会是这样的:

class MyActivity : AppCompatActivity() {
    private val factory: ViewModelProvider.Factory = Injector.myCustomScope().factory()
}

我们正在努力确保工厂是 Activity/Fragment 唯一需要的东西。

到目前为止,一切都很好。

标签: androiddagger-2dagger

解决方案


如何使用 Dagger Android 让一个 Activity 成为另一个 Activity 的子组件?

tl;博士你不能。Dagger Android 遵循严格的AppComponent > ActivityComponent > FragmentComponent方案,无法在两者之间添加自定义范围。


建议你看一下 Dagger Android 源码,真的没那么多。对于您在其中查找组件构建器并构建子组件的每一层,它基本上都是一个 HashMap。一个片段查看其父 Activity,一个 Activity 查看应用程序。没有可以在图层之间添加自定义组件的功能。

可以做的是创建自己的“Dagger Android”变体,您可以在其中实现自己的接口并根据需要混合/匹配组件。但这是相当多的额外工作。如果您有兴趣了解如何做这样的事情,我创建了一个@PerScreen可以在配置更改后继续存在的范围作为概念证明。


推荐阅读