android - Dagger /MissingBinding java.util.Map<java.lang.Class<? extends ViewModel>,Provider<ViewModel>> 不能在没有 @Provides 注释的方法的情况下提供

标签 android kotlin dependencies dagger-2 dagger

这就是我尝试提供我的 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>)

这就是我绑定(bind) 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
}

我在构建过程中收到以下错误:

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.

从我的 Activity 我试图以这种方式接收 ViewModelFactory:

@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory

最佳答案

我最近遇到了同样的问题。 版本 Kotlin :1.3.40 Dagger :2.23.2 我尝试按照本文和 here 中提到的解决方案进行操作

但似乎都没有用。 Dagger 的注释处理器不能很好地与 KAPT 配合使用,出于同样的原因,构建失败了。这也在 Kotlin 上更新 issue也是。

对我来说,将 ViewModelKeyViewModelFactory 都转换为 java 是可行的。 对于 Dagger,可以找到跟踪问题 here .

更新 添加 @JvmSuppressWildcards 解决了这个问题。代码如下所示:

private val providers: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>

关于android - Dagger /MissingBinding java.util.Map<java.lang.Class<? extends ViewModel>,Provider<ViewModel>> 不能在没有 @Provides 注释的方法的情况下提供,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55669810/

相关文章:

android - 在 CookieSyncManager.createInstance 中使用应用程序或 Activity 上下文

android - 应用填充后将 View 重置为默认值

android - 只需使用 CameraX 切换闪光灯

android - Kotlin 流 : How can i get the cache data from subscription in flow when i have new subscriber?

cmake - 使用CMake构建外部项目时如何不进行安装步骤

java - 我在 android studio 中的位置有问题

android - Android 上的 FFMPEG "no such file or directory"

java - Kotlin + Dagger 和注入(inject)构造函数?我对此迷失了

java - GWT 模块和继承

c++ - 不需要安装运行时/依赖项的编程语言