【问题标题】:ViewModelFactory cant instantiate ViewModel correctlyViewModelFactory 无法正确实例化 ViewModel
【发布时间】:2019-12-17 01:37:05
【问题描述】:

当我创建 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) }

视图模型

class LoginViewModel(private val useCase: PostUserToken): ViewModel() {
...
}

错误日志

引起:java.lang.NoSuchMethodException:[类 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)

【问题讨论】:

  • 您能分享一下您的LoginViewModel 及其构造函数吗?
  • 看起来 PostUserTokenImpl 没有合适的构造函数
  • ViewModel 添加 @ianhanniballake PostUserToken 是 PostUserTokenImpl 中实现的接口
  • 我已经发布了视图模型@ianhanniballake

标签: android kotlin mvvm


【解决方案1】:

如果您需要 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.create 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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多