从ViewModel观察其他ViewModel

问题描述 投票:1回答:1

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

模型

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

Item 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...//
}

Main 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吗?我这样做会冒着内存泄漏的风险吗?这是解决此类问题的错误方法吗?

android android-livedata android-viewmodel
1个回答
0
投票

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

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

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

VM最好根据内部生命周期将内部VM直接暴露给活动/碎片以直接使用,以更好地使用它们。

您的VM也应继承ViewModel

© www.soinside.com 2019 - 2024. All rights reserved.