如何取消订阅实时数据android
Posted
技术标签:
【中文标题】如何取消订阅实时数据android【英文标题】:how to unsubscribing from live data android 【发布时间】:2021-04-08 08:19:18 【问题描述】:我有片段ProductsFragment
,它在回收站视图中显示产品列表。
当在回收站视图上单击一个项目时,它会将我带到AddProductFragment
,它会显示所单击项目的产品详细信息。这是我使用 SharedProductViewModel
完成的,它有一个选定的可变实时数据
我面临的问题是ProductsFragment
我有一个浮动操作按钮,我用它导航到AddProductFragment
以添加新产品。但它会显示列表中先前单击的产品详细信息
SharedProductViewModel
class SharedProductViewModel : ViewModel()
val selected = MutableLiveData<Product>()
fun select(product: Product)
selected.value = product
ProductsFragment - 当项目被点击时
private val model: SharedProductViewModel by activityViewModels()
private fun listItemClicked(product: Product)
Toast.makeText(context, "Selected name is $product.name", Toast.LENGTH_LONG).show()
model.select(product)
navController.navigate(R.id.addProductFragment)
AddProductFragment - 单击添加新产品图标时显示先前单击的产品详细信息
注意:观察者总是被触发,无论是点击项目还是加号按钮来添加新产品
private val model: SharedProductViewModel by activityViewModels()
model.selected.observe(viewLifecycleOwner, Observer<Product> item ->
Toast.makeText(context, "item clicked and received" + item.name, Toast.LENGTH_LONG).show()
addProductViewModel.updateProductDetails(item)
)
我不希望它在单击添加新产品时显示之前单击的产品详细信息。
请问我该怎么做
谢谢 回复
【问题讨论】:
添加一个bundle到fragment事务,告诉下一个fragment它应该显示一个新产品还是在视图模型中选择一个。 【参考方案1】:Selected 和 New Product 本质上是两个不同的模型,所以我建议你保留两个不同的LiveData
对象;每个人一个,像这样:
val selectedProduct = MutableLiveData<Product>()
&
val newProduct = MutableLiveData<Product>()
只需记住每次成功添加新产品时将newProduct
重置为null
。这将确保您没有显示旧数据。
【讨论】:
您好,我没有新产品的新型号 您不需要一个新类型,只需要一个 Product 类型的新对象。如何创建该对象取决于您自己,取决于您的代码结构。【参考方案2】:向片段事务添加一个捆绑包,以告知下一个片段是否应该显示新产品或视图模型中选定的产品。
在实例化 Fragment 时,在将它传递给事务以显示它之前添加一个捆绑包:
val fragment = AddProductFragment().apply
arguments = bundleOf("isNewProduct" to true)
然后在 Fragment 中,你可以创建一个读取值的属性。使用此布尔值来确定您是否观察到当前的产品实时数据。
private val isNewProduct: Boolean get() = arguments?.getBoolean("isNewProduct") ?: false
【讨论】:
如果您使用的是导航组件,则可以使用导航参数来代替。以上是关于如何取消订阅实时数据android的主要内容,如果未能解决你的问题,请参考以下文章
Android GB28181接入端实时位置订阅和上报之-如何获取当前经纬度
使用带有 React 和 Apollo 的 graphql 订阅制作实时应用程序