【问题标题】:how to unsubscribing from live data android如何取消订阅实时数据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它应该显示一个新产品还是在视图模型中选择一个。

标签: android kotlin android-livedata android-viewmodel


【解决方案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

【讨论】:

  • 如果您使用的是导航组件,则可以使用导航参数来代替。
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 2022-01-19
  • 2012-03-14
  • 2020-10-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多