从ViewModel观察其他ViewModel

时间:2020-03-11 23:35:30

标签: android android-livedata android-viewmodel

我正在研究POS类型的应用程序,并且试图找出处理显示用户已选择项目总数的最佳方法。为简单起见,假设用户可以选择一个项目或取消选择它(他们不能有多个项目)。这就是我正在考虑的方法,但是我不确定这是否正确:

模型

public class Item {
    public String name;
    public double cost;
}

项目ViewModel

public class ItemViewModel {
    private Item model;
    private MutableLiveData<Boolean> isSelected;

    public ItemViewModel(Item model){
        this.model = model;
        this.isSelected = new MutableLiveData<>(false);
    }

    //...isSelected getter and code to handle selection...//
}

主ViewModel

public class MainViewModel {
    private final MutableLiveData<List<ItemViewModel>> items;
    private final MutableLiveData<Double> totalCost;

    public MainViewModel(List<Item> items){
        List<ItemViewModel> viewModels = new ArrayList<>();

        for(Item item : items) {
            ItemViewModel vm = new ItemViewModel(item);
            vm.getIsSelected().observerForever(this::onSelectionChanged);
            viewModels.add(vm);
        }

        this.items = new MutableLiveData<>(viewModels);
        this.totalCost = new MutableLiveData<>(0.00d);
    }   

    private void onSelectionChanged(Boolean value){
        double total = 0.00d;
        //...total all selected items...//
        this.totalCost.postValue(total);
    }
}

具体地说,可以观察另一个ViewModel吗?我这样做会冒着内存泄漏的危险吗?这是解决此类问题的错误方法吗?

1 个答案:

答案 0 :(得分:0)

我不知道某个虚拟机观察另一个虚拟机是否存在根本上的“错误”。但我建议您仔细看一下以下代码行:

vm.getIsSelected().observerForever(this::onSelectionChanged);

observeForever可能不是您想要做的,因为它不尊重VM的生命周期。与使用它的组件(android / fragment)相匹配的Android VM has a lifecycle(请仔细阅读那些文档),并且该VM在该组件销毁后将继续接收更新。对我来说这听起来很漏气。

VM最好根据内部生命周期将内部VM直接暴露给活动/片段以直接使用。

您的VM也应该子类ViewModel