片段范围之间的SharedViewModel

时间:2020-03-31 16:56:04

标签: android firebase android-fragments android-navigation android-architecture-navigation

我有两个应该共享一个viemodel的片段

class FragmentA(): Fragment() {
  val sharedViewModel = ViewModelProvider.(need_a_shared_context)....//not the activity context
}

class FragmentB(): Fragment() {
val sharedViewModel = ViewModelProvider.(need_a_shared_context).... //not the activity context
}

现在,在每个片段中,我需要访问一个共享的视图模型,而不需要访问包含这些片段的活动所托管的共享的视图模型,因为我正在使用Firebase,并且有一个侦听器将数据发送到我的应用程序。

因此,如果将视图模型附加到活动生命周期,则可以在这两个生命周期之间共享数据,但是当我不在FragmentA()FragmentB()中时,它也会侦听数据< / p>

当我仅在FragmentA()或FragmentB()时,是否有办法限制此共享视图模型的创建?

编辑

由于我使用的是NavigationComponents,因此当我从FragmentA()导航到FragmentB()时,片段A消失了,因此,如果在那里创建我的sharedviewmodel,则当我访问FragmentB()时它将消失和FragmentB()将生成视图模型的新实例。

1 个答案:

答案 0 :(得分:1)

问题有点太广泛了。

您为什么不希望活动托管视图模型?如果您不希望在不实际显示UI时收到通知,则可以将其删除[listeners]。我不完全了解Realtime Database(确保它具有相同的功能),但是Firestore的addSnapshotListener方法返回ListenerRegistration对象,该对象具有用于删除侦听器的remove()方法,因此您不是收到有关文档更新的通知,因此无需为此付费。

您可以根据需要使用任何组件托管ViewModel,但我什至考虑使用Object,因此ViewModel的每个实例都具有相同的单例,该单例存储缓存的值并公开它以LiveData的形式发送给您的观察者,但实际上只有在调用特定方法-LiveData / {之后,才开始和停止观察Firebase节点(并更新您的片段观察到的onStartObserving()) {1}},可从您的片段的onStopObservingonStart()

中调用