片段范围之间的 SharedViewModel
SharedViewModel between the scope of a fragment
我有两个片段应该共享一个 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
}
现在,在每个片段中,我需要访问共享视图模型,而不是包含这些片段的 activity 托管的共享视图模型,因为我正在使用 Firebase,并且我有一个监听器向我的应用程序发送数据.
所以,如果我将视图模型附加到 activity 生命周期,我可以在这两者之间共享数据,但是,当我不在 FragmentA()
或FragmentB()
当我只在 FragmentA() 或 FragmentB() 时,有没有办法限制这个共享视图模型的创建?
编辑
因为我使用的是 NavigationComponents,所以当我从 FragmentA()
导航到 FragmentB()
时,片段 A 消失了,所以,如果我在那里创建我的 sharedviewmodel,它会在我访问 [=12] 时消失=] 和 FragmentB()
将生成一个新的视图模型实例。
这个问题有点太宽了。
您为什么不希望 activity 托管视图模型?如果您不希望在实际不显示 UI 时通知您的听众,您可以将其删除 [listeners]。我不完全了解实时数据库(确定它具有相同的功能),但是 Firestore 的 addSnapshotListener
方法 return ListenerRegistration
对象,它有一个 remove()
方法来删除侦听器,因此您不会收到有关文档更新的通知,因此不会为此付费。
您可以通过任何您想要的组件托管 ViewModel
,但我什至会考虑为其使用 Object,因此您的 ViewModel
的每个实例都会获得相同的单例,它存储缓存的值并以 LiveData
的形式向您的观察者公开它,但实际上仅在调用特定方法后才开始和停止观察 Firebase 节点(并更新 LiveData
您的片段观察)- onStartObserving()
/onStopObserving
,可以从您的片段中调用'onStart()
& onStop()
我有两个片段应该共享一个 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
}
现在,在每个片段中,我需要访问共享视图模型,而不是包含这些片段的 activity 托管的共享视图模型,因为我正在使用 Firebase,并且我有一个监听器向我的应用程序发送数据.
所以,如果我将视图模型附加到 activity 生命周期,我可以在这两者之间共享数据,但是,当我不在 FragmentA()
或FragmentB()
当我只在 FragmentA() 或 FragmentB() 时,有没有办法限制这个共享视图模型的创建?
编辑
因为我使用的是 NavigationComponents,所以当我从 FragmentA()
导航到 FragmentB()
时,片段 A 消失了,所以,如果我在那里创建我的 sharedviewmodel,它会在我访问 [=12] 时消失=] 和 FragmentB()
将生成一个新的视图模型实例。
这个问题有点太宽了。
您为什么不希望 activity 托管视图模型?如果您不希望在实际不显示 UI 时通知您的听众,您可以将其删除 [listeners]。我不完全了解实时数据库(确定它具有相同的功能),但是 Firestore 的 addSnapshotListener
方法 return ListenerRegistration
对象,它有一个 remove()
方法来删除侦听器,因此您不会收到有关文档更新的通知,因此不会为此付费。
您可以通过任何您想要的组件托管 ViewModel
,但我什至会考虑为其使用 Object,因此您的 ViewModel
的每个实例都会获得相同的单例,它存储缓存的值并以 LiveData
的形式向您的观察者公开它,但实际上仅在调用特定方法后才开始和停止观察 Firebase 节点(并更新 LiveData
您的片段观察)- onStartObserving()
/onStopObserving
,可以从您的片段中调用'onStart()
& onStop()