LiveData Observers не удаляются после транзакции фрагмента, и метод onChange вызывается, когда фрагмент добавляется из backstack - PullRequest
0 голосов
/ 13 апреля 2019

Я создаю прослушиватель кликов во фрагменте.Этот слушатель устанавливает значение liveata в модели представления.Я наблюдаю это значение, и когда оно меняется, я помещаю его значение в пакет и передаю его в транзакции фрагмента следующему фрагменту.

Это все работает.Но когда я возвращаюсь к этому фрагменту (с помощью кнопки «назад»), наблюдатель вызывается снова, и он уходит.

Я попытался: - удалить наблюдателя .. используя функцию расширения, как показано в этом постеhttps://code.luasoftware.com/tutorials/android/android-livedata-observe-once-only-kotlin/

  • установка для модели представления и слушателя значения NULL после закрытия наблюдателя

- попытка сброса значения строки жилы


Настройка слушателя:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
 super.onViewCreated(view, savedInstanceState)
        val backpackImage = view?.findViewById(R.id.image_backpack) as ImageView
        val  poloImage = view?.findViewById(R.id.polo_image) as ImageView
        val pantsImage = view?.findViewById(R.id.pants_image) as ImageView
        val socksImage = view?.findViewById(R.id.socks_image) as ImageView
        val sweatshirtImage = view?.findViewById(R.id.sweatshirt_image) as ImageView

        categoryOfImageClickListner = View.OnClickListener {
                view->

            when(view.id){

                R.id.image_backpack -> viewModel?.setCategory(Categories.BACKPACKS.storeCategories)

                R.id.polo_image ->viewModel?.setCategory(Categories.POLOS.storeCategories)
                R.id.pants_image ->viewModel?.setCategory(Categories.PANTS.storeCategories)
                R.id.socks_image ->viewModel?.setCategory(Categories.SOCKS.storeCategories)
                R.id.sweatshirt_image ->viewModel?.setCategory(Categories.SWEATSHIRTS.storeCategories)
            }
        }
        backpackImage.setOnClickListener(categoryOfImageClickListner)
        socksImage.setOnClickListener(categoryOfImageClickListner)
        pantsImage.setOnClickListener(categoryOfImageClickListner)
        poloImage.setOnClickListener(categoryOfImageClickListner)
        sweatshirtImage.setOnClickListener(categoryOfImageClickListner)

    }
---------------------

Наблюдатель:

  override fun onActivityCreated(savedInstanceState: Bundle?) {       
...
...

 var categoryObservable :LiveData<String> = viewModel?.getCategoryForNavigation()!!

            categoryObservable.observeOnce(viewLifecycleOwner, Observer {

                categoryObservable.removeObservers(this)
                it.let {
                    var args = Bundle()
                    args.putString("CATEGORY", it)
                    val productFrag = ProductListFragment()

                    productFrag.arguments = args


                    val fragmentManger = activity?.let {

                        if (it is FragmentActivity)
                            it.supportFragmentManager.beginTransaction()
                                .replace(R.id.fragment_container, productFrag, "PRODUCTFRAG")
                                .addToBackStack(null)
                                .commit()


                    }


                }


            })

````````````
the
Viewmodel
````````````
class HomeViewModel : ViewModel() {



  var liveDataCategory: MutableLiveData<String> = MutableLiveData()

    fun getCategoryForNavigation(): LiveData<String> =liveDataCategory  // observe this in fragment.. and nav onChange
    fun ResetCategoryForNav()= liveDataCategory.postValue(Categories.SWEATSHIRTS.storeCategories)
    fun setCategory( category: String){
        liveDataCategory.postValue(category)
        Log.d("ONCLICK", "Inside Onclick Viewmodel")
    }

...