以下是doc
中我所知道的事情ContributesAndroidInjector
注释的活动创建子组件ContributesAndroidInjector
注释为现在我的问题是: 如何让一个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唯一需要的东西。
到目前为止一切都很棒。
答案 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中解释了作用域,您可以参考它以更好地理解此问题。