从ViewModel观察其他ViewModel



我正在开发一款POS类型的应用程序,我正在努力找出显示用户选择的项目总数的最佳方法。为了简单起见,假设用户可以选择一个项目或取消选择它(他们不能有一个项目的倍数(。这是我正在考虑的,但我不确定这是否是正确的方式:

型号

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

项目视图模型

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

主视图模型

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可以吗?我这样做是在冒内存泄露的风险吗?这是处理这类问题的错误方法吗?

我不知道一个VM观察另一个VM是否有根本的"错误"。但我建议好好看看这行代码:

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

observeForever可能不是您想要做的,因为它不尊重VM的生命周期。安卓虚拟机的生命周期(仔细阅读这些文档(与使用它的组件(安卓/碎片(相匹配,并且在该组件销毁后,该虚拟机将继续接收更新。这听起来很漏洞百出。

对于虚拟机来说,根据其自身的生命周期,将内部虚拟机直接暴露给要直接消费的活动/片段可能更好。

您的虚拟机还应该为ViewModel创建子类。

相关内容

  • 没有找到相关文章

最新更新