如何使用 Dagger2 android 为 ViewModel 使用构造函数注入?
How can I use constructor injection for ViewModel with Dagger2 android?
我想将 ViewModel 与 Dagger2 一起使用,但我不知道如何将构造函数注入与 ViewModelProviders 或 ViewModelProvider.Factory
如何将 ViewModel 与构造函数注入一起使用?我应该使用 ViewModelProvider.Factory 还是 ViewModelProviders?
更新:
您可以在 this link
中找到详细的解决方案
您可以创建自己的自定义 class 扩展 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
}
}
为此 class 创建模块并将该模块注入您的 ApplicationComponent
class
@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 }
我想将 ViewModel 与 Dagger2 一起使用,但我不知道如何将构造函数注入与 ViewModelProviders 或 ViewModelProvider.Factory
如何将 ViewModel 与构造函数注入一起使用?我应该使用 ViewModelProvider.Factory 还是 ViewModelProviders?
更新: 您可以在 this link
中找到详细的解决方案您可以创建自己的自定义 class 扩展 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
}
}
为此 class 创建模块并将该模块注入您的 ApplicationComponent
class
@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 }