在我的应用程序中,我有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.Success或NetworkRequest.Error!!!
我该怎么解决?
1条答案
按热度按时间9udxz4iz1#
如果你观察到你的liveDatas使用了你写的函数,问题应该就解决了。使用onceObserve,如下代码所示