在视图模型中观察变量不起作用
Observing variable in viewmodel is not working
我有这段代码,我试图在其中观察我的视图模型中的变量。但是,每当我观察变量时,它总是 returns false,这是默认值,即使它应该返回 true。我不明白为什么它不起作用,任何想法和建议都会很棒。
这是视图模型部分:
val isSuccessful = MutableLiveData(false)
fun acceptAgreement() = currentAgreement.value?.let {
viewModelScope.launch {
runCatching { agreementsRepository.acceptAgreement(it.id) }
.onSuccess { isSuccessful.postValue(true) }
.onFailure { isSuccessful.postValue(false) }
}
}
片段中的观察,它总是 returns showError():
binding.btnAccept.setOnClickListener { onAccept().also { continue()} }
private fun onAccept() = viewModel.acceptAgreement()
private fun continue() {
viewModel.isSuccessful.observe(viewLifecycleOwner, {
if (it) { start() } else { showError() }
})
}
存储库:
suspend fun acceptAgreement(id: String) = changeAgreement(id, status.ACCEPTED)
private suspend fun changeAgreement(id: String, status: status) {
try { agreementsService.changeAgreement(id, status.serialize()) }
catch (e: Throwable) { logger.error(this::class.java.name, "Failed to change status ${id}", e) }
}
isSuccessful.postValue(
runCatching { agreementsRepository() }.isSuccess
)
使用 isSuccessful.value = true
而不是 isSuccessful.postValue()
。我发现该分配,而不是 postValue
方法,更新了 LiveData 的注册观察者。
您在 运行 onAccept 之后 运行ning continue() 有什么原因吗?
我相信发生的事情是你在观察之前没有设置观察者。
所以你的流程是:
onAccept -> 触发实时数据的更新。
继续 -> 设置 livedata 的观察者。
我建议您将方法调用“continue()”移动到片段的 onCreateView 方法中。它不会被触发,直到它改变视图模型中的状态。
您还需要检查是否设置了片段的 viewLifecycleOwner。
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val binding = FragmentYourFragmentNameBinding.inflate(inflater, container, false).apply {
lifecycleOwner = viewLifecycleOwner
}
continue()
return binding.root
}
我有这段代码,我试图在其中观察我的视图模型中的变量。但是,每当我观察变量时,它总是 returns false,这是默认值,即使它应该返回 true。我不明白为什么它不起作用,任何想法和建议都会很棒。
这是视图模型部分:
val isSuccessful = MutableLiveData(false)
fun acceptAgreement() = currentAgreement.value?.let {
viewModelScope.launch {
runCatching { agreementsRepository.acceptAgreement(it.id) }
.onSuccess { isSuccessful.postValue(true) }
.onFailure { isSuccessful.postValue(false) }
}
}
片段中的观察,它总是 returns showError():
binding.btnAccept.setOnClickListener { onAccept().also { continue()} }
private fun onAccept() = viewModel.acceptAgreement()
private fun continue() {
viewModel.isSuccessful.observe(viewLifecycleOwner, {
if (it) { start() } else { showError() }
})
}
存储库:
suspend fun acceptAgreement(id: String) = changeAgreement(id, status.ACCEPTED)
private suspend fun changeAgreement(id: String, status: status) {
try { agreementsService.changeAgreement(id, status.serialize()) }
catch (e: Throwable) { logger.error(this::class.java.name, "Failed to change status ${id}", e) }
}
isSuccessful.postValue(
runCatching { agreementsRepository() }.isSuccess
)
使用 isSuccessful.value = true
而不是 isSuccessful.postValue()
。我发现该分配,而不是 postValue
方法,更新了 LiveData 的注册观察者。
您在 运行 onAccept 之后 运行ning continue() 有什么原因吗?
我相信发生的事情是你在观察之前没有设置观察者。
所以你的流程是:
onAccept -> 触发实时数据的更新。 继续 -> 设置 livedata 的观察者。
我建议您将方法调用“continue()”移动到片段的 onCreateView 方法中。它不会被触发,直到它改变视图模型中的状态。
您还需要检查是否设置了片段的 viewLifecycleOwner。
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val binding = FragmentYourFragmentNameBinding.inflate(inflater, container, false).apply {
lifecycleOwner = viewLifecycleOwner
}
continue()
return binding.root
}