使用LiveData进行数据绑定--从popbackstack返回片段后,UI没有更新。

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

我有一个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的最新值。有什么想法,为什么?由于数据绑定的方法不行,所以我暂时不使用数据绑定,而是观察片段内的实时数据,效果很好。

data-binding android-livedata
1个回答
0
投票

我认为主要的问题是,当弹出backstack后重新创建片段时,我的视图模型中的switchmaps没有被重新触发。我不得不把驱动开关图的输入变量的setter移到onViewCreated方法里面。

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