【发布时间】:2019-04-28 15:12:28
【问题描述】:
编辑
添加@ViewModelKey 并确保所有视图模型都有@Inject 注释就可以了
使用 Dagger2 Di 库和 ViewModelFactory 注入 ViewModel 导致缺少绑定构建错误。
我得到的错误如下:
AppComponent.java:12: 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. public abstract interface AppComponent extends dagger.android.AndroidInjector<com.honing.daggerexploration.DaggerExplorationApplication> {
^
java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
com.honing.daggerexploration.di.DaggerViewModelFactory(creators)
com.honing.daggerexploration.di.DaggerViewModelFactory is injected at
com.honing.daggerexploration.features.MainActivity.viewModelFactory
com.honing.daggerexploration.features.MainActivity is injected at
dagger.android.AndroidInjector.inject(T) [com.honing.daggerexploration.di.AppComponent → com.honing.daggerexploration.di.modules.ActivityModule_BindActivityMain.MainActivitySubcomponent]
我搜索了其他 stackoverflow 问题,但没有一个为我解决了这个问题。
我使用的Dagger版本是最新的,2.22.1
我敢打赌这个错误与 MVRX 无关,因为我能够在不涉及 mvrx 视图模型类的情况下在小型库中重现它,但是我的意图是最终将 dagger2 与 mvrx 框架一起使用并能够向它注入依赖项。
与此相关的一些代码:
DaggerExplorationApplication
class DaggerExplorationApplication : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().create(this)
}
}
DaggerViewModelFactory:
/**
* ViewModelFactory which uses Dagger to create the instances.
*/
class DaggerViewModelFactory @Inject constructor(
private val creators: @JvmSuppressWildcards Map<Class<out ViewModel>, Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
var creator: Provider<out ViewModel>? = creators[modelClass]
if (creator == null) {
for ((key, value) in creators) {
if (modelClass.isAssignableFrom(key)) {
creator = value
break
}
}
}
if (creator == null) {
throw IllegalArgumentException("Unknown model class: $modelClass")
}
try {
@Suppress("UNCHECKED_CAST")
return creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
ViewModelFactoryModule
@Module
abstract class ViewModelFactoryModule {
@Binds
abstract fun bindViewModelFactory(viewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory
}
活动模块
@Module
abstract class ActivityModule {
@ContributesAndroidInjector(modules = [ViewModelFactoryModule::class])
abstract fun bindActivityMain(): MainActivity
}
关于我用 dagger 实现 mvrx 的努力,据此我需要按方格使用 AssistedInject 库,我看了视频并且相当了解这背后的原因。然而,由于上述错误,我未能构建项目。 chrisbanes 关于这件事的一个有趣的帖子也在this link
带有 dagger2 的 MVRX ViewModels 已由 chrisbanes 使用 this project(Tivi) 成功实现,我尝试按照他们的做法进行操作,但我也失败了。帖子顶部描述的问题阻止了我。准备提供任何缺少的代码,如果需要能够解决此问题,请提供更多信息。
【问题讨论】:
-
请添加
AppComponent源代码
标签: android kotlin dagger-2 android-viewmodel dagger