gpt4 book ai didi

android - 如何防止ViewModel再次触发我的加载栏

转载 作者:行者123 更新时间:2023-12-02 13:32:25 25 4
gpt4 key购买 nike

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

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

我知道livedata将存储我的数据,然后弹出该片段时,它将从livedata本身立即加载它,而不是再次检索它,但是,它还在数据列表上方显示了progressBar,我知道因为我的emit(Resource.Loading())来自我的viewModel,但是...

如果我从另一个片段返回并重新创建此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()再次向我展示了progressDialog

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

编辑

因为我使用的是 livedata-ktx,所以我不想在 View 模型构造函数中加载数据,而是只想在片段中一次处理它

谢谢

最佳答案

我建议添加第四个状态Resource.Idle,当当前状态为Resource.Loading时,只要用户导航离开,它就会发出;观察该状态时,如果其值为Resource.Idle,则不采取任何措施。

关于android - 如何防止ViewModel再次触发我的加载栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60624149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com