我有一個我在片段上呼叫的 livedata 物件。第一次作業正常,它只觸發一次,但第二次我進入它觸發兩次的片段并且不明白為什么。
這就是我所說的觀察:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return inflater.inflate(R.layout.activity_train_with_famous_detail, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupUi(view)
(activity as TrainingWithFamousActivity).hideToolbar()
setupListCategoryVideos(view)
viewModel.getVideosData()
viewModel.videosData.observe(viewLifecycleOwner, Observer {
//second time I enter the fragment it triggers his twice
videoCategoryAdapter.loadItems(it)
})
viewModel.videoSelected?.let { loadTrainWithFamousDetailsData(it) }
}
這是我的視圖模型中的方法:
val videosData = MutableLiveData<List<DtoCelebrityResource>>()
fun getVideosData() {
showLoader()
trainingWithFamousUseCase
.build(this)
.executeWithError({
videosData.value = it
hideLoader()
}, {
hideLoader()
})
}
uj5u.com熱心網友回復:
每當你的片段被創建時,你運行這個:
viewModel.getVideosData()
viewModel.videosData.observe(viewLifecycleOwner, Observer {
//second time I enter the fragment it triggers his twice
videoCategoryAdapter.loadItems(it)
})
我假設getVideosData是一些異步操作,它在另一個協程/執行緒中從資料庫或其他東西中獲取資料。在這種情況下,當該方法更新LiveDatawith 時videosData.value = it,將在稍后的某個時間
下一行是observeLiveData - 如果它當前有一個值,它將立即交付,并且 lambda 將運行。當getVideosData完成并設定一個值時,觀察者將再次運行。
您第一次沒有看到這個的原因可能是因為您LiveData沒有初始值 ( val videosData = MutableLiveData<List<DtoCelebrityResource>>()),所以當您第一次看到observe它時,lambda 不會觸發。然后當設定視頻資料時,你會得到回呼,所以它只發生一次。
但是因為 LiveData 現在有一些資料,并且 a 的目的ViewModel是在 Fragments 和 Activities 關閉時保持狀態,所以下次打開該 Fragment時第一次呼叫時videosData 確實有一個初始值observe。所以你看到了,還有更新。
有一堆,你可以處理這個方法,但呼叫distinctUntilChanged()上videosData(即創建LiveData當資料“改為”只推更新)可能足以解決問題。例如
val videosData = MutableLiveData<List<DtoCelebrityResource>>().distinctUntilChanged()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/409910.html
標籤:
