首页 > 解决方案 > 不了解有关 LiveData 观察者更新的内容,视图直到旋转才更新

问题描述

我正在构建一个应用程序,该应用程序通过连续的片段在调查中包含一系列问题。我使用 FAB 作为“下一步”按钮,它仅在问题得到回答时显示(通过 Spinners)。

当我第一次输入值并进入下一个片段时,它工作正常。在开始下一个片段时,FAB 会按原样隐藏,因为尚未选择新的微调器值。如果我立即返回到上一个片段,微调器已经记住了他们选择的值,而没有将值存储在包中,我可以通过我的 logcat 看到页面被正确地认为是经过验证的,并且 fab 应该是可见的,但事实并非如此。但是,如果我旋转设备,那么晶圆厂会正确显示为与未更改的验证状态匹配。

    2021-01-14 15:56:57.652 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveIsProgramFragment.observe: called, value=false
    start
    2021-01-14 15:58:11.047 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveIsProgramFragment.observe: called, value=true
    2021-01-14 15:58:11.205 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveValidated.observe: called, isValidated=false
    select1
    2021-01-14 15:58:22.858 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveValidated.observe: called, isValidated=false
    select2
    2021-01-14 15:58:31.638 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveValidated.observe: called, isValidated=true
    fab is visible, go to next fragment
    2021-01-14 15:58:57.911 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveIsProgramFragment.observe: called, value=true
    2021-01-14 15:58:57.930 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveValidated.observe: called, isValidated=false
    go back
    2021-01-14 15:59:17.474 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveIsProgramFragment.observe: called, value=true
    2021-01-14 15:59:17.489 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveValidated.observe: called, isValidated=true
    2021-01-14 15:59:17.533 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveValidated.observe: called, isValidated=true
    2021-01-14 15:59:17.533 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveValidated.observe: called, isValidated=true
    fab is not visible, will rotate now
    2021-01-14 16:00:59.434 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveValidated.observe: called, isValidated=true
    2021-01-14 16:00:59.434 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveIsProgramFragment.observe: called, value=true
    2021-01-14 16:00:59.691 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveValidated.observe: called, isValidated=true
    2021-01-14 16:00:59.692 20185-20185/com.example.mindsetprototypev01 D/MainActivity: liveValidated.observe: called, isValidated=true
    fab is visible

liveValidated 被调用 3 次的原因是每个微调器都有一个运行验证的 onItemSelectedListener,然后我还在 onViewStateRestored 中调用了一次验证函数。

通过在返回第一页后重做验证之前将验证标志值设置为 false 来避免这种可见性问题。这是它应该如何工作的吗?它似乎有点笨拙,似乎错过了什么?谢谢

override fun onViewStateRestored(savedInstanceState: Bundle?) {
    Log.d(TAG, "onViewStateRestored: called")
    super.onViewStateRestored(savedInstanceState)

    mainActivity.viewModel.setCurrentFragmentValidated(false)
    mainActivity.viewModel.setCurrentFragmentValidated(validateInputs())
}

指示片段是否已验证的标志存储在我的 ViewModel 中:

class MindsetProgramViewModel : ViewModel() {

    val isCurrentFragmentValidated: MutableLiveData<Boolean> by lazy { MutableLiveData<Boolean>() }
    fun setCurrentFragmentValidated(value: Boolean) {
        isCurrentFragmentValidated.value = value
    }

}

谢谢

标签: androidkotlinandroid-livedata

解决方案


推荐阅读