如何使用Dagger Android创建自定义范围并共享相同的实例



所以这是我从doc

中知道的东西
  1. 引擎盖下的daggerAndroid正在为用ContributesAndroidInjector注释的每个活动创建子组件
  2. 您可以将自定义范围应用于ContributesAndroidInjector注释到
  3. 的方法
  4. 如果两个兄弟姐妹子组件具有相同的范围,则它们仍然具有不同的范围实例
  5. 如果一个活动在子组件中,则可以具有自己的子组件,可以包含片段。这些片段将共享活动的范围。

现在我的问题是:如何使用daggerAndroid成为另一个活动的子组件?

我想这样做,因为我想实现 @userscope/@sessionscope之类的东西。

我知道我可以用dagger而不是daggerandroid做到这一点。但是,使用daggerAndroid,您只能将应用程序(即AndroidIndotor(进行注入活动。您无法将活动用作持有人或母体子组件的主机来注入另一个活动。

我是否正确理解它?

05/14/2018更新:

我最终摆脱了dagger。因此,不再有ContributesAndroidInjector,只有纯dagger。为了注入活动/片段,我使用此处推荐的方式。将是这样的:

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

我们正在尝试确保工厂是活动/碎片需要的唯一东西。

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

如何使用daggerandroid成为另一个活动的子组件?

tl; dr 你不能。daggerAndroid遵循严格的AppComponent > ActivityComponent > FragmentComponent方案,无法在中间添加自定义示波器。


我建议您看看daggerandroid源代码,实际上并不多。对于您查找组件构建器并构建子组件的每个层,它都是基本的hashmap。片段着眼于其父活动,活动着眼于应用程序。没有功能可以在其中添加各层之间的自定义组件。

您的 can 是创建自己的"daggerandroid"的变体,您可以在其中实现自己的接口并根据需要混合/匹配组件。但这是相当多的额外工作。我创建了一个 @PerScreen范围,如果您有兴趣了解如何做这样的事情,则可以在概念上幸存下来。

您可以创建一个称为@PerScreen的自定义范围,也可以具有@PerActvity范围。这些范围之间的区别在于,@PerActivity范围将保持所有活动(如Context,布局Afflater等(之间的共享依赖关系。所有特定活动的依赖项将被范围划定为@PerScreen

@PerApplication -> @PerActivity -> @PerScreen

这可以那样结构。我已经在我的博客文章的引擎盖下解释了范围,您可以参考以更好地了解此事。

最新更新