1

我在我的应用程序上使用 MVVM + LiveData + Dagger 2.27。我正在尝试同时调用 2 个 API。

 viewModel.getMyPendingUnits()
 viewModel.getMyApprovedUnits()

我正在使用 MediatorLiveData 结合 2 个观察者

val approvedUnits = MutableLiveData<Resource<ArrayList<ApprovedUnitsResponse>>>()
val pendingUnits = MutableLiveData<Resource<ArrayList<PendingUnitResponse>>>()


val approvedAndUnApprovedUnitsLiveData: MediatorLiveData<Pair<Resource<ArrayList<ApprovedUnitsResponse>>,
        Resource<ArrayList<PendingUnitResponse>>>> =
    object :
        MediatorLiveData<Pair<Resource<ArrayList<ApprovedUnitsResponse>>,
                Resource<ArrayList<PendingUnitResponse>>>>() {
        var approved: Resource<ArrayList<ApprovedUnitsResponse>>? = null
        var pending: Resource<ArrayList<PendingUnitResponse>>? = null

        init {
            addSource(approvedUnits) { approved ->

                this.approved = approved
                pending?.let {
                    value = approved to it
                }
            }
            addSource(pendingUnits) { pending ->
                this.pending = pending
                approved?.let { value = it to pending }
            }
        }

    }

我在 Fragment 中观察是这样的:

  viewModel.approvedAndUnApprovedUnitsLiveData.observe(viewLifecycleOwner) { (pendingUnits, approvedUnits) ->
        if (pendingUnits is Loading || approvedUnits is Loading) {
            showProgressBar(binding.communityProgressBar, true)

        } else
            if (pendingUnits is Success && approvedUnits is Success) {
}

它工作正常,但是当移动到另一个片段并按下自动调用的观察者并导致列表重复时,我这样removeSource调用

 override fun onDestroy() {
    super.onDestroy()
    viewModel.approvedAndUnApprovedUnitsLiveData.removeSource(viewModel.approvedUnits)
    viewModel.approvedAndUnApprovedUnitsLiveData.removeSource(viewModel.pendingUnits)
}

但它现在正在工作。所以我需要在完成任何想法后移除观察者?

4

0 回答 0