Android Fragments 如何在Android中删除LiveData的观察者

b4lqfgs4  于 2023-05-18  发布在  Android
关注(0)|答案(1)|浏览(205)

在我的应用程序中,我有fragment,在这个片段中我使用了LiveData
我在使用LiveData时遇到问题。

下面的代码我是用片段写的:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //Get id
        viewModel.productID.observe(viewLifecycleOwner) {
            productID = it
        }
        //InitViews
        binding.apply {
            //Submit
            submitBtn.setOnClickListener {
                val rate = rateSlider.value.toInt().toString()
                val comment = commentEdt.text.toString()
                    body.rate = rate
                    body.comment = comment
                    viewModel.callPostCommentApi(productID, body)
            }
        }
        //Load data
        loadNewCommendData()
    }

    private fun loadNewCommendData() {
        binding.apply {
            viewModel.addNewCommentData.observe(viewLifecycleOwner) { response ->
                when (response) {
                    is NetworkRequest.Loading -> {
                        submitBtn.enableLoading(true)
                    }

                    is NetworkRequest.Success -> {
                        submitBtn.enableLoading(false)
                        response.data?.let { data ->
                            Toast.makeText(requireContext(), data.message, Toast.LENGTH_LONG).show()
                            this@AddCommentFragment.dismiss()
                        }
                    }

                    is NetworkRequest.Error -> {
                        submitBtn.enableLoading(false)
                        root.showSnackBar(response.message!!)
                    }
                }
            }
        }
    }

我的问题:调用API并显示吐司消息后,我关闭片段 *,但当我想再次打开片段 * 时,不打开片段 *,只显示Toast**消息。
吐司词留言人:Toast.makeText(requireContext(), data.message, Toast.LENGTH_LONG).show()
我写下面的函数:

fun <T> LiveData<T>.onceObserve(owner: LifecycleOwner, observe: Observer<T>) {
    observe(owner, object : Observer<T> {
        override fun onChanged(value: T) {
            removeObserver(this)
            observe.onChanged(value)
        }
    })
}

使用此函数时,只需调用NetworkRequest.Loading即可,不需要调用NetworkRequest.SuccessNetworkRequest.Error!!!
我该怎么解决?

9udxz4iz

9udxz4iz1#

如果你观察到你的liveDatas使用了你写的函数,问题应该就解决了。使用onceObserve,如下代码所示

viewModel.productID.onceObserve(viewLifecycleOwner) {
        productID = it
    }

viewModel.addNewCommentData.onceObserve(viewLifecycleOwner) { response -> {  //Your code goes here}

相关问题