android - 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 = ""
解决方案
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 实现。
推荐阅读
- html - 使用引导折叠的手风琴角js
- c# - 如何使用 c# 查找一个元素是否包含来自另一个元素的值,而忽略 XML 中的大小写?
- mysql - 类别页面无法正常工作 Magento 2 拥有超过 1300 万种产品
- c - 如何处理for循环中的指针
- sql - 引发通知 '% %',SQLERRM,SQLSTATE 不起作用
- blockchain - 获取挖掘的块而不是假定的返回值
- angular - 类型“SafeResourceUrl”不可分配给类型“字符串”
- c - 我需要使用 stm uart 模块
- javascript - 在 JSON 数组中搜索时间并将其转换为 'epochtime'
- powershell - Powershell 调用已取消