gpt4 book ai didi

android - Dagger2 继承的子组件多重绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 14:00:59 24 4
gpt4 key购买 nike

希望在日复一日地研究这个非常感兴趣的主题“继承子组件多重绑定(bind)之后,在这里找到一些帮助,您可以在这里找到Inherited subcomponent multibindings,这是该页面的最后一个主题。

根据官方文档:

subComponent can add elements to multibound sets or maps that are bound in its parent. When that happens, the set or map is different depending on where it is injected. When it is injected into a binding defined on the subcomponent, then it has the values or entries defined by the subcomponent’s multibindings as well as those defined by the parent component’s multibindings. When it is injected into a binding defined on the parent component, it has only the values or entries defined there.

换句话说。如果父组件具有多重绑定(bind)集或映射并且子组件具有到该多重绑定(bind)的绑定(bind),那么这些绑定(bind)将被链接/添加到父映射取决于这些绑定(bind)在 dagger 范围内注入(inject)的位置(如果有)。

这就是问题所在。

在使用 Kotlin 的 Android 应用程序中使用 dagger 版本 2.24。我有一个使用新的 @Component.Factory 方法的 ApplicationComponent 。 ApplicationComponent 已安装 AndroidSupportInjectionModule

我还有一个使用新的 @Component.Factory 方法的 ActivitySubComponent ,该方法使用以下的 subComponents 参数链接到 AppComponent模块注释。 这个 ActivitySubComponent 通过这样的绑定(bind)提供了一个 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 中的绑定(bind) viewModel 不会添加到 AppComponent 中的 ViewModelFactory 映射中。

换句话说。文档所描述的情况根本没有发生。

如果我将 viewModels 绑定(bind)移动到任何 AppComponent 模块中,那么一切都可以工作。

你知道这里会发生什么吗?

最佳答案

您将 ViewModelProvider.Factory 的范围限定为 @Singleton。这确保了它将被创建并保存在 @Singleton 组件中。

删除作用域是安全的,因为它不保留任何状态,并且允许在需要时使用正确的绑定(bind)集创建工厂。

关于android - Dagger2 继承的子组件多重绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57633347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com