如何从实时数据android取消订阅



我有一个片段ProductsFragment,它在回收器视图中显示产品列表。

当在回收器视图上单击某个项目时,它会将我带到AddProductFragment,在那里它会显示所单击项目的产品详细信息。这是我使用SharedProductViewModel完成的,它有一个选定的可变实时数据

我面临的问题是在ProductsFragment上,我有一个浮动操作按钮,用于导航到AddProductFragment以添加新产品。但它显示了列表中先前单击的产品详细信息

SharedProductViewModel

class SharedProductViewModel : ViewModel() {
val selected = MutableLiveData<Product>()
fun select(product: Product) {
selected.value = product
}
}

产品碎片-点击时

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

我不希望它在单击添加新产品时显示以前单击的产品详细信息。

,我该怎么做

谢谢R

Selected和New Product本质上是两种不同的模型,所以我建议您保留两个不同的LiveData对象;每个一个,就像这样:

val selectedProduct = MutableLiveData<Product>()

&

val newProduct = MutableLiveData<Product>()

每次成功添加新产品时,请记住将newProduct重置为null。这将确保您不会显示旧数据。

向片段事务添加一个bundle,告诉下一个片段它应该在视图模型中显示新产品还是所选产品。

实例化Fragment时,在将其传递给事务以显示它之前,先向其添加一个bundle:

val fragment = AddProductFragment().apply {
arguments = bundleOf("isNewProduct" to true)
}

然后在Fragment中,您可以创建一个读取值的属性。使用此布尔值可确定是否观察到当前产品的实时数据。

private val isNewProduct: Boolean get() = arguments?.getBoolean("isNewProduct") ?: false

最新更新