在视图模型中观察变量不起作用

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
}