将 MutableMap 更改为 Map 时 ViewModelFactory 出现 Dagger2 错误
Dagger2 Error in ViewModelFactory when change MutableMap to Map
我在尝试使用 dagger2 时遇到问题
这是我的 ViewModelFactory:
class ViewModelFactory @Inject constructor(
private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
val creator = viewModels[modelClass]
?: viewModels.asIterable().firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("$UNKNOWN_MODEL_CLASS $modelClass")
return try {
@Suppress("UNCHECKED_CAST")
creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
当我将 viewModels
更改为 Map 时出现以下错误:
public abstract interface AppComponent {
^
java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,? extends javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
com.example.baseproject.utils.ViewModelFactory(viewModels)
com.example.baseproject.utils.ViewModelFactory is injected at
com.example.baseproject.di.ViewModelBuilder.bindViewModelFactory(viewModelFactory)
androidx.lifecycle.ViewModelProvider.Factory is injected at
com.example.baseproject.MainActivity.viewModelFactory
com.example.baseproject.MainActivity is injected at
dagger.android.AndroidInjector.inject(T) [com.example.baseproject.di.AppComponent → com.example.baseproject.di.ActivityModules_ContributeMainActivity.MainActivitySubcomponent]
请帮帮我,我不知道为什么会这样
您缺少 @JvmSuppressWildcards
。你想得到一个 Provider<ViewModel>
,而不是 Provider<? extends ViewModel>
,但 Kotlin 会为你生成一个没有注释的 Provider<? extends ViewModel>
。
private val viewModels: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>) : ViewModelProvider.Factory {
我在尝试使用 dagger2 时遇到问题 这是我的 ViewModelFactory:
class ViewModelFactory @Inject constructor(
private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
val creator = viewModels[modelClass]
?: viewModels.asIterable().firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("$UNKNOWN_MODEL_CLASS $modelClass")
return try {
@Suppress("UNCHECKED_CAST")
creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
当我将 viewModels
更改为 Map 时出现以下错误:
public abstract interface AppComponent {
^
java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,? extends javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
com.example.baseproject.utils.ViewModelFactory(viewModels)
com.example.baseproject.utils.ViewModelFactory is injected at
com.example.baseproject.di.ViewModelBuilder.bindViewModelFactory(viewModelFactory)
androidx.lifecycle.ViewModelProvider.Factory is injected at
com.example.baseproject.MainActivity.viewModelFactory
com.example.baseproject.MainActivity is injected at
dagger.android.AndroidInjector.inject(T) [com.example.baseproject.di.AppComponent → com.example.baseproject.di.ActivityModules_ContributeMainActivity.MainActivitySubcomponent]
请帮帮我,我不知道为什么会这样
您缺少 @JvmSuppressWildcards
。你想得到一个 Provider<ViewModel>
,而不是 Provider<? extends ViewModel>
,但 Kotlin 会为你生成一个没有注释的 Provider<? extends ViewModel>
。
private val viewModels: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>) : ViewModelProvider.Factory {