You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 09:36:03