如何使用Dagger Android

时间:2018-04-26 04:52:31

标签: android dagger-2 dagger

以下是doc

中我所知道的事情
  1. 引以为傲的Dagger Android为每个使用ContributesAndroidInjector注释的活动创建子组件
  2. 您可以将自定义范围应用于ContributesAndroidInjector注释为
  3. 的方法
  4. 如果两个兄弟子组件具有相同的范围,则它们仍将具有不同的范围实例
  5. 如果Activity在子组件中,它可以有自己的子组件,可以包含Fragments。那些片段将共享Activity所具有的作用域实例。
  6. 现在我的问题是: 如何让一个Activity成为使用Dagger Android的另一个活动的子组件?

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

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

    我理解正确吗?

    05/14/2018更新:

    我最终摆脱了Dagger Android。所以不再是ContributesAndroidInjector,只是纯粹的匕首。为了注入Activity / Fragment,我使用推荐的方式here。它将是这样的:

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

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

    到目前为止一切都很棒。

2 个答案:

答案 0 :(得分:3)

  

如何使用Dagger Android将一个Activity作为另一个活动的子组件?

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

我建议您查看Dagger Android源代码,它真的不是那么多。它是每个层的HashMap的基础,您可以在其中查找组件构建器并构建子组件。一个片段查看其父Activity,一个Activity查看Application。没有功能可以在图层之间添加自定义组件。

可以做的是创建自己的“Dagger Android”变体,您可以根据需要实现自己的界面和混合/匹配组件。但这是一项额外的工作。如果您有兴趣了解如何做这样的事情,我创建了@PerScreen scope that survives configuration changes作为概念证明。

答案 1 :(得分:1)

您可以创建一个自定义范围,例如@PerScreen,您还将拥有@PerActvity范围。这些作用域之间的区别在于@PerActivity作用域将维护Context,Layout Inflater等所有活动之间的共享依赖关系。所有特定于活动的依赖关系的作用域将为@PerScreen。 >

@PerApplication -> @PerActivity -> @PerScreen

可以这样构造。 我已经在my blog post中解释了作用域,您可以参考它以更好地理解此问题。