【问题标题】:How to use a Firebase auth listener in a repository class MVVM?如何在存储库类 MVVM 中使用 Firebase 身份验证侦听器?
【发布时间】:2020-09-22 04:19:15
【问题描述】:

这是我的MainActivity 班级:

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 变为空时(例如用户退出),我会相应地更新 UI。它工作正常,但是当涉及到 MVVM 时,活动知道 Firebase,这是正确的。我有这个结构:

Activity -> ViewModel - Repository (calls to Firebase)

如何监听存储库类中的 auth 变化?还是有其他解决办法?

【问题讨论】:

    标签: android firebase mvvm firebase-authentication android-architecture-components


    【解决方案1】:

    在 MVVM 架构中,我们有一个事件驱动的架构,视图模型中发生的一切都会发出,观察者在视图中得到它(活动或片段) 在您的案例存储库中处理获取用户,然后将其提供给查看模型,然后您应该发出结果。 看看谷歌开发者在 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 在这里,您使用 singleLiveEvent 只观察一次更改,例如在请求用户状态触发 base 后,用户状态的情况会发生变化。 在您的视图模型中创建一个像这样的 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 成为观察者: 类 myViewModel : LifecycleObserver{

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

    【讨论】:

    • 感谢您的回答,但我遗漏了一些东西。据说应该根据activity的生命周期来移除listener。这就是我实现 onStart 和 onStop 的原因,因此可以正确添加/删除它。这种情况怎么样?
    • 太棒了!你提到的好点,在android架构组件中我们有“LifeCycle Aware Component”,你在你的视图中注册生命周期,然后在你的viewModel中轻松处理它:看看这个链接:developer.android.com/topic/libraries/architecture/lifecycle
    • 我明白了。让我试着回复你。谢谢
    • 我试图理解文档中写的内容,但有些东西我不明白。你能告诉我至少几行代码,看看我如何实现我的FirebaseAuth.AuthStateListener。提前致谢。
    • 使用此解决方案未成功。刚刚找到使用回调的解决方案。投票赞成提供一种现代的方式来实现这一点。还是谢谢。
    猜你喜欢
    • 2018-10-17
    • 2017-11-04
    • 1970-01-01
    • 2012-09-15
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2017-06-07
    相关资源
    最近更新 更多