首页 > 解决方案 > MutableLiveData 通过从 ViewModel 转换 LiveData 来暴露

问题描述

我使用下面显示的代码不在主要活动中公开 MutableLiveData

class CalculatorViewModel : ViewModel(){
 private val operation = MutableLiveData<String>()
    val stringOperation :LiveData<String>
        get() = operation
}

但我想出了一种方法来通过 LiveData getter 访问 MutableLiveData 的值,甚至更改它,这是我的代码:

(viewModel.stringOperation as MutableLiveData).value = ""

标签: androidkotlin

解决方案


MutableLiveData当您需要在视图模型之外修改 LiveData 时,应该使用它。如果您不希望它从 ViewModel 中暴露出来,则必须使用 LiveData。

如果您查看LiveData类,您会注意到LiveData 是一个抽象类,这意味着您必须先扩展它才能使用它。对于像您这样的情况,您将扩展 LiveData 类。例如,在该子类中,您将调用 api 并使用私有方法更新值。所以基本上你的 LiveData 类将负责加载和更新数据。查看此链接以获取示例:

https://developer.android.com/topic/libraries/architecture/livedata#extend_livedata

这是根据文档正确使用LiveData类的方法:

public class StockLiveData extends LiveData<BigDecimal> {
    private StockManager stockManager;

    private SimplePriceListener listener = new SimplePriceListener() {
        @Override
        public void onPriceChanged(BigDecimal price) {
            setValue(price);
        }
    };

    public StockLiveData(String symbol) {
        stockManager = new StockManager(symbol);
    }

    @Override
    protected void onActive() {
        stockManager.requestPriceUpdates(listener);
    }

    @Override
    protected void onInactive() {
        stockManager.removeUpdates(listener);
    }
}

综上所述,当您想要修改 LiveData/ViewModel 之外的数据时,请使用 MutableLiveData。对于所有其他情况,请提供您自己的 LiveData 实现。


推荐阅读