Android 片段范围之间的SharedViewModel
我有两个片段应该共享一个模型Android 片段范围之间的SharedViewModel,android,firebase,android-fragments,android-navigation,android-architecture-navigation,Android,Firebase,Android Fragments,Android Navigation,Android Architecture Navigation,我有两个片段应该共享一个模型 class FragmentA(): Fragment() { val sharedViewModel = ViewModelProvider.(need_a_shared_context)....//not the activity context } class FragmentB(): Fragment() { val sharedViewModel = ViewModelProvider.(need_a_shared_context).... //no
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
}
现在,在每个片段中,我需要访问一个共享的viewmodel,而不是由包含这些片段的活动托管的sharedviewmodel,因为我正在使用Firebase,我有一个侦听器向我的应用程序发送数据
因此,如果我将viewmodel附加到活动生命周期,我可以在这两者之间共享数据,但是,当我不在FragmentA()
或FragmentB()
当我只在FragmentA()或FragmentB()时,有没有办法确定这个sharedviewmodel的创建范围
编辑
由于我使用的是NavigationComponents,当我从
FragmentA()
导航到FragmentB()
时,片段A将消失,因此,如果我在那里创建我的sharedviewmodel,当我访问FragmentB()
时,它将消失,FragmentB()
将生成viewmodel的新实例。问题有点太广泛了
为什么不希望活动承载viewmodel?如果您不希望在不实际显示UI时通知您的侦听器,您可以删除它[侦听器]。我不知道实时数据库的确切情况(当然它有相同的功能),但是Firestore的addSnapshotListener
方法返回ListenerRegistration
对象,该对象有一个remove()
方法来删除侦听器,因此您不会收到文档更新的通知,因此不会为此收取费用
你可以用你想要的任何组件来主持<代码> VIEWMID[/COD],但是我甚至会考虑使用对象来实现它,所以你的<代码> VIEWMDES> /CODE的每一个实例都得到相同的单体,它存储缓存的值并以“代码> LIFEDATA < /代码>的形式向你的观察者公开,但实际上,只有在调用特定的方法后才会启动和停止对Firebase节点的观察(并更新片段观察的
LiveData
),这些方法可以从片段的onStart()
&onStop()
调用