Dagger / MissingBinding java.util.Map <java.lang.Class <?如果没有@Provides注释的方法,则无法提供扩展ViewModel>,Provider <ViewModel >>

Luc*_*tti 1 dependencies android kotlin dagger dagger-2

这就是我要提供的方式ViewModelFactory

@Suppress("UNCHECKED_CAST")
@Singleton
class ViewModelFactory @Inject constructor(
    private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>
) : ViewModelProvider.Factory {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T = viewModels[modelClass]?.get() as T
}

@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
Run Code Online (Sandbox Code Playgroud)

这就是我绑定的方式ViewModelFactory

@Suppress("unused")
@Module
abstract class ViewModelModule  {
    @Binds
    internal abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(MainViewModel::class)
    internal abstract fun mainViewModel(viewModel: MainViewModel): ViewModel
}
Run Code Online (Sandbox Code Playgroud)

在构建期间收到以下错误:

di/Injector.java:9: error: [Dagger/MissingBinding] java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.
Run Code Online (Sandbox Code Playgroud)

从我,Activity我试图以ViewModelFactory这种方式:

@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
Run Code Online (Sandbox Code Playgroud)

Ash*_*mar 11

我最近遇到了同样的问题。 版本 Kotlin:1.3.40 Dagger:2.23.2 我尝试按照这篇文章和这里提到的解决方案

但似乎没有一个工作。Dagger 的注释处理器在 KAPT 上运行不佳,出于同样的原因,构建失败。这也在 Kotlin问题上进行了更新。

对我来说,将ViewModelKey和都转换ViewModelFactory为 java 工作。对于 Dagger,可以在此处找到跟踪问题。

更新 添加@JvmSuppressWildcards修复了该问题。代码如下所示:

private val providers: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
Run Code Online (Sandbox Code Playgroud)


Luc*_*tti 6

经过多一点挖掘后,我发现了问题。它与我使用的代码完全无关。这一点Kotlin 1.3.30

这里有更多关于它的信息。

降级以Kotlin 1.3.21解决问题。