Android 我从未进入ViewModel中的LiveDataScope
我已经为登录开发了两个功能 第一个“loginOne”在我使用ViewModel范围时起作用 另一个在我使用LiveData作用域时不起作用 你有什么想法吗?我想让“loginTwo”正常工作 APIAndroid 我从未进入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
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)
}