Android 如何防止viewmodel再次触发我的加载栏
我有一个片段加载一个产品列表,然后我转到另一个片段,但当我返回Android 如何防止viewmodel再次触发我的加载栏,android,kotlin,mvvm,android-viewmodel,android-navigation,Android,Kotlin,Mvvm,Android Viewmodel,Android Navigation,我有一个片段加载一个产品列表,然后我转到另一个片段,但当我返回资源时,加载会再次触发,显示在我的进度栏中 我正在使用导航组件,我知道我应该处理我的状态,但我的问题是 我知道livedata将存储我的数据,然后当弹回到这个片段时,它将从livedata本身中间加载它,而不再检索它,但是,它也会在我的数据列表上方显示我的progressBar,我知道这是因为我的从我的viewModel发出(Resource.Loading()),但是 如果我从另一个片段返回并在activitycreated上重新创
资源时,加载
会再次触发,显示在我的进度栏中
我正在使用导航组件,我知道我应该处理我的状态,但我的问题是
我知道livedata将存储我的数据,然后当弹回到这个片段时,它将从livedata本身中间加载它,而不再检索它,但是,它也会在我的数据列表上方显示我的progressBar,我知道这是因为我的从我的viewModel发出(Resource.Loading())
,但是
如果我从另一个片段返回并在activitycreated上重新创建,有没有办法不显示这个进度或不发出加载状态
代码
我的片段
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()
}
}
})
}
视图模型
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
,所以我不想在viewmodel构造函数中加载数据,而是想在片段中只处理一次
谢谢我建议添加第四个状态
资源。空闲
,当当前状态为资源时,用户导航离开时会发出。加载
,观察状态时,当其值为资源。空闲
获取产品列表()
是函数
不是一个变量
调用它返回
newLiveData
对象。请尝试不使用以下函数:-
val productListLiveData: LiveData<Resource> = liveData(Dispatchers.IO) {
emit(Resource.Loading())
try {
val getProductList = repo.getProductList()
emit(getProductList)
} catch (e:Exception){
emit(Resource.Failure(e))
}
}
val-productListLiveData:LiveData=LiveData(Dispatchers.IO){
发出(Resource.Loading())
试一试{
val getProductList=repo.getProductList()
发射(getProductList)
}捕获(e:例外){
发射(资源故障(e))
}
}
在
片段中观察它 谢谢你的回答,非常时髦,我喜欢,问题是我需要在我的第一次通话中加入一个新的观察者,我不想这样做,谢谢你的回答。另一个建议是使用资源。加载对象,使其只使用一次。如果您感兴趣,请检查:我认为密封类的另一个状态是多余的这个特殊情况@CoffeeBreak@mohsin实际上,我正在向它传递一个我在问题中没有指定的参数,因此您可以使用viewModelFactory
直接将参数传递给viewModel
,每次使用builder lambda创建一个新的liveData对象都是不好的做法@CoffeeBreakI我已经有了一个viewModelFactory在viewmodel中注入我的repo,我需要做的是在函数中点击emit(Resource.Loading())时不触发progressBar如果在片段中创建了依赖关系图,参数
也可以与回购协议一起注入
@参见