我有两个应该共享一个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()
将生成视图模型的新实例。
答案 0 :(得分:1)
问题有点太广泛了。
您为什么不希望活动托管视图模型?如果您不希望在不实际显示UI时收到通知,则可以将其删除[listeners]。我不完全了解Realtime Database(确保它具有相同的功能),但是Firestore的addSnapshotListener
方法返回ListenerRegistration
对象,该对象具有用于删除侦听器的remove()
方法,因此您不是收到有关文档更新的通知,因此无需为此付费。
您可以根据需要使用任何组件托管ViewModel
,但我什至考虑使用Object,因此ViewModel
的每个实例都具有相同的单例,该单例存储缓存的值并公开它以LiveData
的形式发送给您的观察者,但实际上只有在调用特定方法-LiveData
/ {之后,才开始和停止观察Firebase节点(并更新您的片段观察到的onStartObserving()
) {1}},可从您的片段的onStopObserving
和onStart()