【问题标题】:Type mismatch error while using a coroutine使用协程时出现类型不匹配错误
【发布时间】:2020-10-28 03:24:40
【问题描述】:

我的 viewModel 中有以下内容

fun getUsernamePassword(inputUserName:String, inputPassword:String):List<User> = viewModelScope.launch(Dispatchers.IO) {
        return repository.getUsernamePassword(inputUserName, inputPassword)
    }

但是,我收到一条错误消息,提示 Type mismatch. Required: List&lt;User&gt; Found:Job 我该怎么做才能解决此错误。最终目标是让函数在非黑色线程上运行,并从主线程中运行一部分以避免冲突和错误。

【问题讨论】:

  • 如果是 Kotlin,我不确定它是否应该被标记为 Java,嗯?
  • Kotlin 但它也与 Java 相关。
  • 有什么帮助吗? @corsiKa
  • 我的意思是,作为一个只做了 15 年 Java 并且与 Kotlin 毫无关系的家伙,不,我什至不知道第一行想说什么。我只能说检查 repository.getUsernamePassword(String,String) 返回 List 而不是 Job?

标签: java android kotlin android-room kotlin-coroutines


【解决方案1】:

viewModelScope.launch 返回一个背景Job,您可以在其中执行实际的回购操作。在这种情况下,您可能需要一个 Observable 或 LiveData 来存储您的 UI 需要对其进行操作的用户列表。

你可以在你的 ViewModel 中做这样的事情:

val userList = MutableLiveData<List<User>>()

fun getUsernamePassword(inputUserName:String, inputPassword:String) = viewModelScope.launch(Dispatchers.IO) {
    val list = repository.getUsernamePassword(inputUserName, inputPassword)
    userList.postValue(list)
}

在您的视图中,您需要通过以下方式观察 ViewModel 的 userList 的变化:

viewModel.userList.observe(viewLifecycleOwner, {
    // Place UI changes here
})

【讨论】:

  • 好吧,让我试试。
  • 好吧,让我试试
  • 非常感谢。当我对自己在做什么有所了解时,我明白了并弄清楚了。
猜你喜欢
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
相关资源
最近更新 更多