Kotlin 如何在存储库(MVVM)中分离Firestore SnapshotListener

Kotlin 如何在存储库(MVVM)中分离Firestore SnapshotListener,kotlin,google-cloud-firestore,listener,android-livedata,android-mvvm,Kotlin,Google Cloud Firestore,Listener,Android Livedata,Android Mvvm,我相信我需要分离Firestore侦听器,但如果不将上下文传递到我的存储库,我看不到如何做到这一点。以下是一个例子: 片段 此方法在创建的视图中调用,只需更新用于在我的recyclerview中设置列表的私有var sitesList=ArrayList(): 私人娱乐设置观察员(){ Log.d(标记“setupobserver()”) businessViewModel.listenToSites().observe(viewLifecycleOwner,Observer{allSites

我相信我需要分离Firestore侦听器,但如果不将上下文传递到我的存储库,我看不到如何做到这一点。以下是一个例子:

片段

此方法在创建的视图中调用,只需更新用于在我的recyclerview中设置列表的私有var sitesList=ArrayList():

私人娱乐设置观察员(){
Log.d(标记“setupobserver()”)
businessViewModel.listenToSites().observe(viewLifecycleOwner,Observer{allSites->
if(sitesList!=allSites&&allSites!=null){
sitesList.clear()
sitesList.addAll(所有站点)
sitesAdapter.setList(sitesList)
sitesAdapter.notifyDataSetChanged()文件
}
})

}
您的存储库层不应包含一行与Android相关的代码。您的ViewModel是Android和repo层代码的共同点。您可以通过实现
LifeCycleObserver
界面来感知ViewModel生命周期

class YourViewModel : LifeCycleObserver {

  @OnLifecycleEvent(Lifecycle.Event.ON_STOP) //Annotate it with any lifecycle event of your choice.
  fun aMethodThatRemovesObserver() {
      //Invoked on onStop()
  }

}
在您的活动中:

onCreate() {
   lifecycle.addObserver(yourViewModel)
}

无需担心手动删除ViewModel observer,它将进入ViewModel的
未清除状态。请记住,存储库层应该没有与Android相关的代码。如果需要上下文,可以使用
AndroidViewModel
(适用于应用程序)。有时无法分离出上下文,在这种情况下,我只提供应用程序上下文,而不是活动上下文。

您的存储库层不应该包含一行与Android相关的代码。您的ViewModel是Android和repo层代码的共同点。您可以通过实现
LifeCycleObserver
界面来感知ViewModel生命周期

class YourViewModel : LifeCycleObserver {

  @OnLifecycleEvent(Lifecycle.Event.ON_STOP) //Annotate it with any lifecycle event of your choice.
  fun aMethodThatRemovesObserver() {
      //Invoked on onStop()
  }

}
在您的活动中:

onCreate() {
   lifecycle.addObserver(yourViewModel)
}

无需担心手动删除ViewModel observer,它将进入ViewModel的
未清除状态。请记住,存储库层应该没有与Android相关的代码。如果需要上下文,可以使用
AndroidViewModel
(适用于应用程序)。有时无法分离出上下文,在这种情况下,我只提供applicationContext,而不是Activity context。

感谢您的详细响应-以这种方式分离Firestore侦听器实际上是一种好的做法吗?i、 e.除非分离(可能会重复侦听器),否则它们会保留吗?我不确定这是否被普遍认为是最佳做法,但肯定比让活动控件添加/删除它不应该知道的侦听器要好。通过这样做,活动只知道它可以使用和从中受益的接口。感谢您的详细响应-以这种方式分离Firestore侦听器实际上是一种良好的做法吗?i、 e.除非分离(可能会重复侦听器),否则它们会保留吗?我不确定这是否被普遍认为是最佳做法,但肯定比让活动控件添加/删除它不应该知道的侦听器要好。通过这样做,活动只知道它可以使用并从中受益的接口。