创建ViewModelFactory以便将UseCase与存储库一起传递时,出现此错误
class LoginVMFactory(private val useCase: PostUserTokenImpl):ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return modelClass.getConstructor(PostUserTokenImpl::class.java).newInstance(useCase)
}
}
private val viewModel by lazy { ViewModelProviders.of(this, LoginVMFactory(PostUserTokenImpl(UserRepoImpl()))).get(LoginViewModel::class.java) }
class LoginViewModel(private val useCase: PostUserToken): ViewModel() {
...
}
错误日志
原因:java.lang.NoSuchMethodException:[class com.test.domain.PostUserTokenImpl] 在java.lang.Class.getConstructor0(Class.java:2327) 在java.lang.Class.getConstructor(Class.java:1725) 在com.test.presentation.viewmodel.LoginVMFactory.create(LoginVMFactory.kt:13)
错误日志指向此
return modelClass.getConstructor(PostUserTokenImpl::class.java).newInstance(useCase)
答案 0 :(得分:0)
如果您在ViewModel中需要一些参数,可以按照以下说明操作:
1。创建BaseViewModelFactory
class BaseViewModelFactory <T> (val creator: () -> T) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return creator() as T
}
}
2。创建2个扩展功能(Kotlin)以创建视图模型
inline fun <reified T : ViewModel> Fragment.getViewModel(noinline creator: (() -> T)? = null): T {
return if (creator == null) {
ViewModelProviders.of(this).get(T::class.java)
} else {
ViewModelProviders.of(this, BaseViewModelFactory(creator)).get(T::class.java)
}
}
inline fun <reified T : ViewModel> FragmentActivity.getViewModel(noinline creator: (() -> T)? = null): T {
return if (creator == null) {
ViewModelProviders.of(this).get(T::class.java)
} else {
ViewModelProviders.of(this, BaseViewModelFactory(creator)).get(T::class.java)
}
}
viewModel = getViewModel()
或
viewModel = getViewModel {
LoginViewModel(usecase)
}