繁体   English   中英

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

[英]How to use a Firebase auth listener in a repository class MVVM?

这是我的MainActivity class:

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)

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

在 MVVM 架构中,我们有一个事件驱动的架构,视图中发生的所有事情 model 发出,观察者在您的案例存储库处理获取用户的视图(活动或片段)中获取它,然后将其提供给查看 model,然后您应该发出结果。 看看谷歌开发人员在 GitHub 中的 SingleLiveEvent 架构示例: https://github.com/android/architecture-samples/blob/dev-todo-mvvm-live/todoapp/app/src/main/java/com /example/android/architecture/blueprints/todoapp/SingleLiveEvent.java here you use singleLiveEvent to Observe the changes just once, for things like your case with the state of the user just change after requesting for user state to fire base. 在您的视图 model 中创建一个像这样的 SingleLiveEvent:

fun userState() : SingleLiveEvent<Boolean> = SingleLiveEvent()

然后:

if(repo.getAuthUser() != null)
    userState().postValue(true)

现在你应该像这样在你的视图中观察它:

viewModel.userState().observe(this, Observer {
    if (it!!)
        //user is created
    else
        //user is null
})

为了在 viewModel 中处理 onStart 和 onStop,您可以轻松地使用 Lifecycle-Aware Component:

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

lifecycle.addObserver(viewModel)

然后通过从“LifecycleObserver”扩展您的 viewModel 使其成为观察者,并在内部处理这样的生命周期: class myViewModel: LifecycleObserver{

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

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM