所以这是我从doc
中知道的东西- 引擎盖下的daggerAndroid正在为用
ContributesAndroidInjector
注释的每个活动创建子组件 - 您可以将自定义范围应用于
ContributesAndroidInjector
注释到
的方法 - 如果两个兄弟姐妹子组件具有相同的范围,则它们仍然具有不同的范围实例
- 如果一个活动在子组件中,则可以具有自己的子组件,可以包含片段。这些片段将共享活动的范围。
现在我的问题是:如何使用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
这可以那样结构。我已经在我的博客文章的引擎盖下解释了范围,您可以参考以更好地了解此事。