如何防止视图模型再次激发我的加载栏



我有一个加载产品列表的片段,然后我转到另一个片段,但当我回来时,Resource.Loading再次被触发,显示在我的进度条中

我正在使用导航组件,我知道我应该处理我的状态,但我的问题是。

我知道livedata会存储我的数据,然后当弹回这个片段时,它会从livedata本身直接加载它,不会再检索它,但是,它也会在我的数据列表上方显示我的progressBar,我知道这是因为我的viewModel中的emit(Resource.Loading()),但是。。。

如果我从另一个片段回来并重新创建这个onActivityCreated,有没有办法不显示这个进度或不发出Loading状态?

代码

我的片段

override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel.fetchProductList()
.observe(viewLifecycleOwner, Observer {
when (it) {
is Resource.Loading -> {
showProgress()
}
is Resource.Success -> {
hideProgress()
landingAdapter.itemList = it.data
if (landingAdapter.itemCount == 0) {
Toast.makeText(
requireContext(),
"No items yet",
Toast.LENGTH_SHORT
).show()
}
landingAdapter.notifyDataSetChanged()
}
is Resource.Failure -> {
hideProgress()
}
}
})
}

ViewModel

fun fetchProductList() = liveData(Dispatchers.IO) {
emit(Resource.Loading())
try{
val getProductList = repo.getProductList()
emit(getProductList)
}catch (e:Exception){
emit(Resource.Failure(e))
}
}

在这一点上,我认为在popBackstack上重新创建片段时再次发射Resource.Loading()是在再次向我显示我的进度对话框

我试过使用事件包装器,但它也做同样的

编辑

由于我使用的是livedata-ktx,所以我不想在视图模型构造函数中加载数据,相反,我只想在片段中处理一次

感谢

我建议添加第四个状态Resource.Idle,当当前状态为Resource.Loading时,每当用户导航离开时,该状态就会发出,当观察该状态时,当其值为Resource.Idle时,不采取任何行动。

fetchProductList()functionNOT一个variable,称其为returns新的LiveData<Resource>对象。相反,尝试不使用函数:-

val productListLiveData: LiveData<Resource> = liveData(Dispatchers.IO) {
emit(Resource.Loading())
try {
val getProductList = repo.getProductList()
emit(getProductList)
} catch (e:Exception){
emit(Resource.Failure(e))
}
}

fragment中观察。

相关内容

  • 没有找到相关文章

最新更新