Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MutableLiveData通过从ViewModel强制转换LiveData来公开_Android_Kotlin - Fatal编程技术网

Android MutableLiveData通过从ViewModel强制转换LiveData来公开

Android 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

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

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);
    }
}