Как запретить viewmodel снова запускать мою панель загрузки - PullRequest
0 голосов
/ 10 марта 2020

У меня есть фрагмент, который загружает список продуктов, затем я go к другому фрагменту, но когда я возвращаюсь, Resource.Loading снова запускается, показывает мой индикатор выполнения

Я использую компоненты навигации и Я знаю, что должен справиться со своим состоянием, но мой вопрос заключается в следующем.

Я знаю, что liveata будет хранить мои данные, а затем при возврате к этому фрагменту он будет сразу же загружать их из самого livingata и не получать это снова, но это также показывает мой индикатор выполнения над моим списком данных, я знаю, что это потому, что мой emit(Resource.Loading()) из моей viewModel, но ...

Есть ли способ не показать этот прогресс или нет испустить это состояние загрузки, если я вернусь из другого фрагмента и воссоздаю это onActivityCreated?

код

мой фрагмент

 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))
        }
    }

В этот момент я думаю, что испускание снова Resource.Loading() при воссоздании моего фрагмента в popBackstack снова показывает мне мой progressDialog

У меня есть попытался использовать обертку Event, но она также делает то же самое

Edit

Так как я использую livedata-ktx, я не хочу загружать свои данные в конструктор viewmodel, вместо этого я хочу обработать это только один раз в моем фрагменте

Спасибо

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Я бы предложил добавить четвертое состояние Resource.Idle, которое излучается всякий раз, когда пользователь уходит, когда текущее состояние Resource.Loading, и при наблюдении за состоянием не предпринимать никаких действий, если его значение равно Resource.Idle.

0 голосов
/ 10 марта 2020

fetchProductList() - это function НЕ a 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...