首页 > 解决方案 > 如何使用 Dagger2 android 为 ViewModel 使用构造函数注入?

问题描述

我想将 ViewModel 与 Dagger2 一起使用,但我不知道如何将构造函数注入与 ViewModelProviders 或 ViewModelProvider.Factory 一起使用

如何将 ViewModel 与构造函数注入一起使用?我应该使用 ViewModelProvider.Factory 还是 ViewModelProviders?

更新: 您可以在此链接中找到包含详细信息的解决方案

标签: android-studiomvvmdependency-injectiondaggerandroid-viewmodel

解决方案


您可以创建自己的自定义类扩展ViewModelProvider.Factory

class ViewModelFactory @Inject constructor(
private val providers: @JvmSuppressWildcards Map<Class<out ViewModel>, Provider<ViewModel>>
) : ViewModelProvider.Factory {

override fun <T : ViewModel> create(modelClass: Class<T>): T {
    var provider = providers[modelClass]
    if (provider == null) {
        for ((key, value) in providers) {
            if (modelClass.isAssignableFrom(key)) {
                provider = value
                break
            }
        }
    }
    if (provider == null) {
        throw IllegalStateException("unknown model class $modelClass")
    }

    return provider.get() as T
  }
}

为这个类创建模块并将模块注入你的ApplicationComponent

@Module
abstract class ViewModelFactoryModule {
   @Binds
   abstract fun bindViewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
}

然后在你的片段里面注入这个工厂

@Inject
lateinit var factory: ViewModelProvider.Factory

并像这样初始化您的viewModel

val vm: YourViewModel by viewModels { factory }

推荐阅读