ViewModelFactory无法正确实例化ViewModel

时间:2019-12-17 01:37:05

标签: android kotlin mvvm

创建ViewModelFactory以便将UseCase与存储库一起传递时,出现此错误

viewModelFactory

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) }

ViewModel

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)

1 个答案:

答案 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)
    }
}
  1. 简单易用
viewModel = getViewModel()

viewModel = getViewModel {
 LoginViewModel(usecase)
}