Android 如何在存储库类MVVM中使用Firebase身份验证侦听器?

Android 如何在存储库类MVVM中使用Firebase身份验证侦听器?,android,firebase,mvvm,firebase-authentication,android-architecture-components,Android,Firebase,Mvvm,Firebase Authentication,Android Architecture Components,这是我的main活动课程: class MainActivity : AppCompatActivity(), FirebaseAuth.AuthStateListener { @Inject lateinit var auth: FirebaseAuth override fun onAuthStateChanged(auth: FirebaseAuth) { val firebaseUser = auth.currentUser if (fi

这是我的
main活动
课程:

class MainActivity : AppCompatActivity(), FirebaseAuth.AuthStateListener {
    @Inject lateinit var auth: FirebaseAuth

    override fun onAuthStateChanged(auth: FirebaseAuth) {
        val firebaseUser = auth.currentUser
        if (firebaseUser == null) {
            //Update UI
        }
    }

    override fun onStart() {
        super.onStart()
        auth.addAuthStateListener(this)
    }

    override fun onStop() {
        super.onStop()
        auth.removeAuthStateListener(this)
    }
}
这意味着当FirebaseUser变为null(例如,用户已注销)时,我会相应地更新UI。它工作正常,但是当涉及到MVVM时,活动知道Firebase,这是不正确的。我有这样的结构:

Activity -> ViewModel - Repository (calls to Firebase)

如何侦听存储库类中的身份验证更改?或者还有其他解决方案吗?

在MVVM体系结构中,我们有一个事件驱动的体系结构,视图模型中发生的一切都会发出,观察者会看到它(活动或片段) 在您的情况下,存储库处理获取用户,然后将其交给视图模型,然后您应该发出结果。 在GitHub中查看google开发者为架构示例制作的SingleLiveEvent: 在这里,您使用singleLiveEvent只观察一次更改,例如您的案例,在请求用户状态fire base之后,用户的状态只会发生更改。 在视图模型中创建如下所示的SingleLiveEvent:

fun userState() : SingleLiveEvent<Boolean> = SingleLiveEvent()
现在你应该这样观察它:

viewModel.userState().observe(this, Observer {
    if (it!!)
        //user is created
    else
        //user is null
})
为了在viewModel中处理onStart和onStop,您可以轻松使用生命周期感知组件:

在您的视图中,添加将实现“LifecycleObserver”的观察者: 我将把它放在我的viewModel上,如下所示:

lifecycle.addObserver(viewModel)
然后将viewModel从“LifecycleObserver”扩展为观察者,并在其内部处理生命周期,如下所示: 类myViewModel:LifecycleObserver{

@OnLifecycleEvent(Event.ON_STOP)
    fun onStop() {
        //do some work1
    }

@OnLifecycleEvent(Event.ON_START)
    fun onStart() {
        //do some work2
    }

}

谢谢你的回答,但我遗漏了一些东西。据说应该根据活动的生命周期删除侦听器。这就是我实现onStart和onStop的原因,因此可以正确添加/删除。这种情况如何?太好了!你提到的很好的一点,在android架构组件中,我们有“生命周期感知组件",您可以在视图中注册生命周期,然后在视图中轻松处理生命周期模型:查看此链接:我明白了。让我尝试返回给您。谢谢我尝试了解文档中所写的内容,但有些事情我不明白。请您至少给我几行代码,看看如何实现我的
FirebaseAuth.AuthStateListener
。提前感谢。使用此解决方案未成功。只是通过回调找到了一个解决方案。投票支持提供一种实现此功能的现代方法。无论如何,谢谢。
@OnLifecycleEvent(Event.ON_STOP)
    fun onStop() {
        //do some work1
    }

@OnLifecycleEvent(Event.ON_START)
    fun onStart() {
        //do some work2
    }

}