Android MutableLiveData通过从ViewModel强制转换LiveData来公开
我使用下面显示的代码不在主活动中公开MutableLiveDataAndroid MutableLiveData通过从ViewModel强制转换LiveData来公开,android,kotlin,Android,Kotlin,我使用下面显示的代码不在主活动中公开MutableLiveData class CalculatorViewModel : ViewModel(){ private val operation = MutableLiveData<String>() val stringOperation :LiveData<String> get() = operation } MutableLiveData应该在您需要在viewmodel之外修改LiveDa
class CalculatorViewModel : ViewModel(){
private val operation = MutableLiveData<String>()
val stringOperation :LiveData<String>
get() = operation
}
MutableLiveData
应该在您需要在viewmodel之外修改LiveData时使用。如果您不希望它从ViewModel中公开,则必须使用LiveData
如果您查看LiveData
类,您会注意到LiveData是一个抽象类,这意味着您必须先扩展它,然后才能使用它。对于像您这样的情况,您可以扩展LiveData类。例如,在该子类中,可以调用api并使用私有方法更新值。因此,基本上您的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);
}
}
公共类StockLiveData扩展了LiveData{
私人股票经理;
私有SimplePriceListener侦听器=新SimplePriceListener(){
@凌驾
公共无效onPriceChanged(大十进制价格){
设定值(价格);
}
};
公共StockLiveData(字符串符号){
stockManager=新的stockManager(符号);
}
@凌驾
受保护的void onActive(){
stockManager.requestPriceUpdates(侦听器);
}
@凌驾
受保护的void onInactive(){
stockManager.RemoveUpdate(侦听器);
}
}
总之,当您想要修改LiveData/ViewModel之外的数据时,请使用MutableLiveData。对于所有其他情况,请提供您自己的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);
}
}