NoSuchMethodException尝试实例化ViewModel

时间:2019-12-17 17:29:35

标签: android kotlin mvvm android-mvvm

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

  

原因: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)

我尝试做一个ViewModel实例,该实例包含并连接

视图

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

LoginVMFactory

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

LoginViewModel

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)

}

任何想法为什么会这样?我怀疑那可能是因为我们无法使用我们的视图模型实例化接口吗?

1 个答案:

答案 0 :(得分:0)

将我的实现更改为

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