【问题标题】:NoSuchMethodException trying to instantiate ViewModelNoSuchMethodException 试图实例化 ViewModel
【发布时间】:2020-04-10 06:07:43
【问题描述】:

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

引起: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)

我尝试做一个我的 ViewModel 的实例,它持有和接口

查看

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

登录虚拟机工厂

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

登录视图模型

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)

}

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

【问题讨论】:

    标签: android kotlin mvvm android-mvvm


    【解决方案1】:

    将我的实现更改为

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2020-05-19
      • 2019-06-16
      • 2011-12-14
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多