android - 不了解有关 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
}
}
谢谢
解决方案
推荐阅读
- c# - 是否可以将字符串转换为二进制表示的字节数组
- string-literals - 如何测试各种类型的突变体的突变
- javascript - 如何使用 NestJS 的 httpService 捕获 3rd 方 api 错误响应?
- sqlalchemy - 我的 mixin 的 SQLAlchemy 问题!(declared_attr 和同义词)
- excel - VBA:设置读取 Excel 文件到整个组织的权限
- jenkins - Jenkins junit 结果为空
- java - Cassandra 一个 CqlSession 在 40 个线程中共享,有时 CQL 返回空无记录
- sql - 将可为空的局部变量传递给 where 条件
- r - 在 R 中使用“sf”的几何无效
- security - 对定义的 url 列表进行基线扫描 ZAP (OWASP)