【发布时间】:2019-12-29 04:41:18
【问题描述】:
希望在研究这个非常感兴趣的主题“继承的子组件multibindings,您可以在这里找到Inherited subcomponent multibindings,这是该页面中的最后一个主题。
根据官方文档:
subComponent可以将元素添加到绑定在其父级中的multibound集或映射。发生这种情况时,集合或地图会根据注入的位置而有所不同。当它被注入到subcomponent上定义的绑定中时,它具有由子组件的multibindings定义的值或条目以及由父组件的multibindings定义的值或条目。当它被注入到父组件上定义的绑定中时,它只有在那里定义的值或条目。
换句话说。如果父 Component 具有 multibound set or map 并且 child component 绑定到该多绑定,则这些绑定将链接/添加到父映射中,具体取决于这些绑定在匕首范围内的注入位置(如果有)。
这就是问题所在。
在使用Kotlin 的Android 应用程序中使用dagger version 2.24。我有一个ApplicationComponent 使用新的@Component.Factory 方法。 ApplicationComponent 已经安装了AndroidSupportInjectionModule。
我还有一个使用新的@Component.Factory 方法的ActivitySubComponent,并且这个方法使用Module 注释的subComponents 参数链接到AppComponent。
这个 ActivitySubComponent 通过这样的绑定提供了一个ViewModel
@Binds
@IntoMap
@ViewModelKey(MyViewModel::class)
fun provideMyViewModel(impl: MyViewModel): ViewModel
@ViewModelKey 是自定义 Dagger 注释。
我也有一个这样实现的 ViewModelFactory。
@Singleton
class ViewModelFactory @Inject constructor(
private val viewModelsToInject: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T =
viewModelsToInject[modelClass]?.get() as T
}
一个普通的 ViewModelFactory
这里的区别是我在 AppComponents 模块之一中提供了这个 ViewModelFactory。但是 ActivitySubComponent 中的绑定视图模型没有被添加到 AppComponent 的 ViewModelFactory 映射中。
换句话说。文档所描述的根本没有发生。
如果我将 viewModels 绑定移动到任何 AppComponent 模块中,那么一切正常。
你知道这里会发生什么吗?
【问题讨论】:
-
嘿,你找到解决办法了吗?
-
我也在为这种情况而苦苦挣扎。
-
我遇到了类似的情况,我不得不将
ViewModelFactory设置移动到每个子组件而不是父组件(使用模块继承)。我也很想知道为什么它不像记录的那样工作。
标签: android kotlin dagger-2 dagger