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构造函数中加载数据,而是想在片段中只处理一次


谢谢

我建议添加第四个状态
资源。空闲
,当当前状态为
资源时,用户导航离开时会发出。加载
,观察状态时,当其值为
资源。空闲
获取产品列表()
函数
不是一个
变量
调用它
返回
new
LiveData
对象。请尝试不使用以下函数:-

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如果在片段中创建了依赖关系图,
参数
也可以与
回购协议一起注入
@参见