android - NoSuchMethodException 试图实例化 ViewModel

标签 android kotlin mvvm android-mvvm

我正在尝试实例化我的 View 模型,但出现此错误

Caused by: java.lang.NoSuchMethodException: [class com.test.domain.PostUserTokenImpl] at java.lang.Class.getConstructor0(Class.java:2327) at java.lang.Class.getConstructor(Class.java:1725) at com.test.presentation.viewmodel.LoginVMFactory.create(LoginVMFactory.kt:13)



我尝试做一个持有和接口(interface)的 ViewModel 实例

看法
private val viewModel by lazy { ViewModelProviders.of(this, LoginVMFactory(PostUserTokenImpl(UserRepoImpl()))).get(LoginViewModel::class.java) }

登录VMFactory
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)
    }
}

登录 View 模型
class LoginViewModel(private val useCase: PostUserToken): ViewModel() {
 ...
}

PostUserToken
interface PostUserToken {

    suspend fun postUserToken(user: User): Resource<Boolean>
}

PostUserTokenImpl
class PostUserTokenImpl(private val repo: UserRepo): PostUserToken {

   override suspend fun postUserToken(user:User):Resource<Boolean> = repo.saveUserToken(user)

}

知道为什么会这样吗?我怀疑这可能是因为我们不能用我们的 View 模型的接口(interface)实例化?

最佳答案

将我的实现更改为

class LoginVMFactory(private val useCase: PostUserToken):ViewModelProvider.Factory {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return modelClass.getConstructor(PostUserToken::class.java).newInstance(useCase)
    }
}

然后在我看来
private val viewModel by lazy { ViewModelProviders.of(this, LoginVMFactory(PostUserTokenImpl(UserRepoImpl()))).get(LoginViewModel::class.java) }

关于android - NoSuchMethodException 试图实例化 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59379305/

相关文章:

java - 删除角 View TableView

wpf - 检查后更改单选按钮的图像

wpf - WPF MVVM 应用程序中的键盘事件?

java - Dagger 在 Android 应用程序中生成重复的 `XXXDialogFragment_MembersInjector` 类(程序类型已存在)

android - 在 Jetpack Compose 中的 API 响应后更新 LazyColumn

kotlin - Hilt Activity必须附加到@AndroidEntryPoint应用程序

java - 从应用程序启动 Google map

android - fragment : Programmatically create view for xml to fill

android - 使用 espresso 在导航菜单中向下滚动

java - 为什么 Cloud Firestore 数据库中的文档未被删除?