android - 将MutableLiveData传递给其他ViewModel是否有效?

标签 android mvvm viewmodel android-livedata

我有一个场景,其中两个片段(A和B)需要共享一个对象列表,可以从两个屏幕上对其进行突变。 A和B片段分别具有一个对应的ViewModel(A_ViewModel和B_ViewModel)。它们包含一些有关如何更改共享数据的逻辑。
为了保持共享数据的完整性,我创建了AB_Flow_ViewModel,它是 Activity 范围的,并包含包裹在MutableLiveData中的共享数据。
我决定将MutableLiveData对象作为构造函数参数传递给A和B子片段。
我从未在任何地方见过这种方法,但是它似乎对我来说非常有效。
这样做有什么弊端吗?
这是我的解决方案的伪代码:

// Navigation: (A ->  B)
class A() : Fragment() {

  private val viewModel: A_ViewModel ...

  override fun onViewCreated(
      view: View,
      savedInstanceState: Bundle?
  ) {
    super.onViewCreated(view, savedInstanceState)
    viewModel.sharedData.observe {
      ...
    }
  }

}


class A_ViewModel @Inject  constructor(
    val sharedData: MutableLiveData<List<Any>>
) : ViewModel() {

  fun changeSharedData(newSharedData: List<Any>) {
    sharedData.value = newSharedData
  }
}

@Module
class A_Module {

  @Provides
  @FragmentScoped
  fun provideSharedData(fragment: A) =
      fragment.activityViewModels<AB_Flow_ViewModel>().value.sharedData
}

class B() : Fragment() {

  private val viewModel: A_ViewModel ...

  override fun onViewCreated(
      view: View,
      savedInstanceState: Bundle?
  ) {
    super.onViewCreated(view, savedInstanceState)
    viewModel.sharedData.observe {
      ...
    }
  }
}

@Module
class B_Module {

  @Provides
  @FragmentScoped
  fun provideSharedData(fragment: B) =
      fragment.activityViewModels<AB_Flow_ViewModel>().value.sharedData
}


class B_ViewModel @Inject constructor(
    val sharedData: MutableLiveData<List<Any>>
) : ViewModel() {
  fun changeSharedData(newSharedData: List<Any>) {
    sharedData.value = newSharedData
  }
}

class AB_Flow_ViewModel() : ViewModel() {
  val sharedData = MutableLiveData<List<Any>>()
}

最佳答案

我强烈建议不要在两个片段之间共享MutableLiveData,如果遇到错误,它将非常难以调试,因为您将不知道谁在更改该数据以及在何处导致这种奇怪的状态。
我想做的是将我所有的MutableLiveData保留在ViewModel中,并仅将LiveData公开给Fragments/View进行观察。 MutableLiveData需要发生的每个更改,我都是通过ViewModel内部的函数来完成的。

private val _sharedData = MutableLiveData<List<Any>>()
val sharedData: LiveData<List<Any>>
    get() = _sharedData
我将有趣的changeSharedData放入AB_Flow_ViewModel内,并将所有逻辑放在一个ViewModel中,而不是两个。如果FragA和FragB的逻辑需要不同,我将使用两种不同的方法来更改相同的LiveDdata

关于android - 将MutableLiveData传递给其他ViewModel是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63297358/

相关文章:

Android 为图像文件创建自定义 Exif 属性

c# - 控制模板中的 Storyboard 访问属性

c# - 在WPF中从后面的代码中删除代码

javascript - knockout 复选框选择过滤器

android - 获取 ViewModel ViewModelProvider.Factory 和应用上下文

java - findViewById 必须为 void 但不能使其为 void

android - 可搜索微调器不搜索空格

android - 如何让Android TextView 自动向下滚动到末尾?

silverlight - Silverlight 的各种 MVVM 框架的优点和缺点是什么?

android - 如何使用 MVVM 在 RecyclerView 中监听 onCheckedChangeListener?