Kotlin中使用自定义Pair类观察LiveData不触发的问题排查
问题原因及解决方案
核心问题
LiveData的观察者触发逻辑是:只有当LiveData持有的对象引用发生改变时,才会通知观察者。你当前的代码只是修改了CustomPair内部的属性值,但LiveData指向的还是同一个CustomPair对象,因此观察者不会收到更新通知。
代码问题分析
在setPlanet1Name方法中,你直接修改了现有CustomPair对象的first和second属性:
fun setPlanet1Name(planetName : String, visibility : Boolean) { planet1EnabledAndText.value?.run { first = planetName second = visibility } }
这种操作没有改变LiveData中存储的对象引用,LiveData无法感知到内部属性的变化,自然不会触发观察者。
解决方案
方案1:创建新的CustomPair对象赋值给LiveData
利用Kotlin data class自带的copy方法,生成新的对象替换原有对象,让LiveData感知到引用变化:
fun setPlanet1Name(planetName : String, visibility : Boolean) { val currentPair = planet1EnabledAndText.value if (currentPair != null) { // 生成新的CustomPair对象 val newPair = currentPair.copy(first = planetName, second = visibility) planet1EnabledAndText.value = newPair } else { // 初始值为空时直接创建新对象 planet1EnabledAndText.value = CustomPair(planetName, visibility) } }
方案2:将CustomPair的属性改为不可变(val)
强制只能通过创建新对象来修改属性,从根源避免误操作:
data class CustomPair<T, V>( val first : T, val second : V )
此时修改属性必须通过copy生成新对象,配合方案1的set方法使用,能更安全地保证LiveData的通知逻辑正常工作。
内容的提问来源于stack exchange,提问作者Ashish Joshi
相关产品推荐
相关产品推荐

