如何在ViewModel中初始化、赋值数据类类型的LiveData并正确取值?
问题根源
你创建MutableLiveData<SaleData>()时仅初始化了LiveData容器,内部的value默认是null,所以_saleData.value?.saleType = 1这类代码中的安全调用会直接跳过,赋值逻辑根本不会执行,LiveData里一直存储的是null,自然取不到值。
而你单独使用MutableLiveData<Int>时是直接给value整体赋值,不是在null对象上修改属性,所以可以正常生效。
正确操作方式
1. 先给LiveData设置初始对象实例
必须先将完整的SaleData对象存入LiveData,才能修改其内部属性,有两种实现方式:
方式1:创建LiveData时直接传入默认实例
// 创建时直接传入初始SaleData实例,避免初始value为null private val _saleData: MutableLiveData<SaleData> = MutableLiveData( SaleData( saleType = 1, saleDetail = 0, // 按业务需求设置初始值 salePrice = 0, saleRate = 0, printAmount = 0 ) ) val saleData: LiveData<SaleData> = _saleData
方式2:在init块中初始化实例
init { // 先存入完整的SaleData实例 _saleData.value = SaleData( saleDetail = 0, salePrice = 0, saleRate = 0, printAmount = 0 ) // 此时value不为空,才能正常修改内部属性 _saleData.value?.saleType = 1 changeSaleType() }
2. 修改对象属性时需通知LiveData更新
LiveData仅会监测value本身的引用变化,直接修改对象内部属性不会触发观察者回调。如果需要观察者收到更新,修改属性后要重新给value赋值:
fun changeSaleType() { _saleData.value = _saleData.value?.apply { saleType = 2 } // 子线程操作时用postValue // _saleData.postValue(_saleData.value?.apply { saleType = 2 }) }
3. 取值操作
确认LiveData已存入实例后,直接调用即可:
Log.d("DataLog", "" + saleData.value?.saleType)
内容的提问来源于stack exchange,提问作者Polaris Nation
相关产品推荐
相关产品推荐

