我有一个viewmodel,里面有以下方法。
private fun getCart(): LiveData<MenuCart?> {
return Transformations.switchMap(venueId) { venueId ->
venueId?.let {
repository.getMenuCart(it)
} ?: MutableLiveData<MenuCart?>(null)
}
}
fun getCartQty(): LiveData<Int> {
return Transformations.map(cartVal) {
it?.items?.count() ?: 0
}
}
在视图模型中也定义了这些字段。
val cartVal = getCart()
val cartQtyVal = getCartQty()
然后在xml中定义了这个TextView。
android:text="@{viewModel.cartQtyVal.toString()}"
并将xml的数据定义为:
<data>
<variable
name="viewModel"
type="mypackage.viewmodels.VenueMealsViewModel" />
</data>
在fragment里面,有这个。
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val _binding = LayoutVenueMealsMenuBinding.inflate(inflater, container, false)
_binding!!.lifecycleOwner = this
_binding!!.viewModel = this.viewModel
return _binding!!.root
}
我在一些地方使用了类似的方法,而且很有效。但是在这种情况下,我看到了一个bug,在导航到另一个视图后,再返回到这个片段,UI没有更新cartQtyVal的最新值。有什么想法,为什么?由于数据绑定的方法不行,所以我暂时不使用数据绑定,而是观察片段内的实时数据,效果很好。
我认为主要的问题是,当弹出backstack后重新创建片段时,我的视图模型中的switchmaps没有被重新触发。我不得不把驱动开关图的输入变量的setter移到onViewCreated方法里面。