微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更改 LiveData 日历的值不会触发观察者

如何解决更改 LiveData 日历的值不会触发观察者

在片段中,我显示来自日历对象的日期。这个日期是从片段的 viewmodel 中获得的,它是一个实时日期:

private val _theDate = mutablelivedata<Calendar>()
val theDate: LiveData<Calendar>
    get() = _theDate

viewmodel 中,我还有一个将 _theDate 添加 1 天的函数

fun goToDayAfter() {
    _theDate.value!!.add(Calendar.DATE,1)
}

这个函数是在点击同一个fragment的按钮后调用的,它不会触发观察者:

viewmodel.theDate.observe(viewLifecycleOwner,androidx.lifecycle.Observer { newDate ->
    displayDate(newDate)
})

有关更多详细信息和调试后,我认为_theDate已更改但未触发观察者,如果我更改为另一个片段并返回新的_theDate已更改。

此外,如果我将方法 goToDayAfter() 更改为:

fun goToDayAfter() {
    val tmp = _theDate.value!!
    tmp.add(Calendar.DATE,1)
    _theDate.value = tmp
}

有效!

为什么直接修改 _theDate 不会触发观察者?是因为它是一个对象而不是一个前提吗?有没有更好的解决方案来传递 tmp 变量?

解决方法

要触发更新,您必须设置 select csr.CreatedAt,sum(case when sn.name like '%.net%' then csr.JobOffersCount end) as cnt_net,sum(case when sn.name like '%sap%' then csr.JobOffersCount end) as cnt_sap from CompanySkillRegionDemands csr join SkillNames sn on csr.SkillId = sn.SkillId and sn.Language = 'en' group by csr.CreatedAt order by CreatedAt; 的值,就像您发现的那样,即使用:

LiveData

否则,如果您改变(即更改)_theDate.value = ... 指向的值 (LiveData,它无法知道该值已更改!这就是不触发更新的原因。

首选不可变对象

我建议使用不可变对象并在每次要更改它们时重新创建它们。对于不可变对象,更难遇到这种错误。一个额外的好处是观察 _theDate.value!!.add(Calendar.DATE,1) 的代码不能改变它。

因此,我会使用 _theDate 而不是 Calendar。如果您在 java.time.LocalDateTime 文件中向 desugar_jdk_libs 添加依赖项,则可以使用它:

build.gradle

在这种情况下,您的代码将如下所示:

coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。