Android 我从未进入ViewModel中的LiveDataScope

Android 我从未进入ViewModel中的LiveDataScope,android,kotlin,viewmodel,android-livedata,kotlin-coroutines,Android,Kotlin,Viewmodel,Android Livedata,Kotlin Coroutines,我已经为登录开发了两个功能 第一个“loginOne”在我使用ViewModel范围时起作用 另一个在我使用LiveData作用域时不起作用 你有什么想法吗?我想让“loginTwo”正常工作 API interface LoginAPI{ @发布(“登录”) 挂起fun getUser(@Body loginRequest:loginRequest):用户 } 存储库 class LoginRepository(私有val loginAPI:loginAPI){ suspend fun ge

我已经为登录开发了两个功能

第一个“loginOne”在我使用ViewModel范围时起作用

另一个在我使用LiveData作用域时不起作用

你有什么想法吗?我想让“loginTwo”正常工作

API

interface LoginAPI{
@发布(“登录”)
挂起fun getUser(@Body loginRequest:loginRequest):用户
}
存储库

class LoginRepository(私有val loginAPI:loginAPI){
suspend fun getUser(loginRequest:loginRequest)=loginAPI.getUser(loginRequest)
}
视图模型

class LoginViewModel(private val loginRepository:loginRepository):ViewModel(){
私有变量用户:LiveData?=null
fun loginOne(用户名:String,密码:String){
viewModelScope.launch{
//我可以在这里输入并获取用户:)
val user=loginRepository.getUser(LoginRequest(用户名、密码))
使用者
}
}
趣味登录wo(用户名:String,密码:String){
user=liveData(Dispatchers.IO){
//我从不进去……为什么?
val user=loginRepository.getUser(LoginRequest(用户名、密码))
发射(用户)
}
}
fun getUser():LiveData?=用户
}
片段,我的viewModel被注入了Koin

覆盖已创建的视图(视图:视图,savedInstanceState:Bundle?){
super.onViewCreated(视图,savedInstanceState)
loginViewModel.getUser()?.observe(这个,观察者{user->
Log.d(LoginFragment::class.java.name,“用户:$User”)
})
loginViewModel.loginOne(“用户”、“pcw123”)
loginViewModel.loginTwo(“用户”、“pcw123”)
}

确保以正确的方式创建了
范围。此外,您正在使用适当的
调度员
,以实现所需的结果

您还可以检查调用是否在您想要
postValue
时执行。 检查
作业
是否仍处于活动状态

看看这个。 您的
emmit
呼叫看起来可疑

使用LiveData时,可能需要异步计算值。例如,您可能希望检索用户的首选项并将其提供给您的UI。在这些情况下,可以使用liveData builder函数调用挂起函数,将结果作为liveData对象提供

每次emit()调用都会挂起块的执行,直到在主线程上设置LiveData值为止

在下面的示例中,loadUser()是在别处声明的挂起函数。使用liveData builder函数异步调用loadUser(),然后使用emit()发出结果:

val用户:LiveData=LiveData{
val data=database.loadUser()//loadUser是一个挂起函数。
发射(数据)
}

编辑:
MutableLiveData
for
用户
变量-解决了问题。

来自文档:

liveData构建块用作结构化并发 协同程序和LiveData之间的原语代码块开始 当LiveData变为活动状态并自动取消时执行 当LiveData变为非活动状态时,在可配置的超时之后


因此,在您的例子中,“用户”liveData在您从片段中观察时已经被激活。因为您在观察liveData之后调用了loginTwo(),因此将不再触发emit函数。在观察liveData之前,请尝试调用loginTwo(),以从liveData ktx获取发射值。

我可以要求您添加作用域创建行吗?这会让视野更清晰。@YaroslavOvdiienko我在哪里能找到这个/IDK:D这是你的项目。看看源代码,您如何以及在何处创建此
范围
liveData
&
viewModelScope
我刚刚在我的viewModel中导入了它:
import androidx.lifecycle.viewModel import androidx.lifecycle.liveData
您正在使用的是
viewModelScope
,不使用LiveDataScope启动coroutine@diAz这可能有助于alsoTry创建另一个
private var user:LiveData?=第二个函数为null
。有关协同路由的详细信息:。只需切换分支即可查看所有信息。上面的LiveData builder和用于协同路由的LiveDataScope之间有什么区别?这就像是
viewModelScope
,但对于LiveData?
val user: LiveData<User> = liveData {
    val data = database.loadUser() // loadUser is a suspend function.
    emit(data)
}