如何在仓库类MVVM中使用Firebase auth监听器?

问题描述 投票:0回答:1

这是我的 MainActivity 类,这意味着当FirebaseUser变为空值(用户注销)时,我就会相应地更新UI。

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)

如何监听仓库类中的权限变化?还是有其他解决方案?

android firebase mvvm firebase-authentication android-architecture-components
1个回答
1
投票

在MVVM架构中,我们有一个事件驱动的架构,所有在视图模型中发生的事情都会发出,观察者在视图(活动或片段)中得到它,在你的案例中,仓库处理得到用户,然后把它交给视图模型,然后你应该发出结果。https:/github.comandroidarchitecture-samplesblobdev-todo-mvvm-livetodoappappsrcmainjavacomexampleandroidarchitectureblueprintstodoappSingleLiveEvent.java。在这里你使用singleLiveEvent来观察变化只需一次,对于像你这样的情况与用户的状态只是改变后请求用户状态火基.在你的View模型中创建一个SingleLiveEvent这样的。

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

然后.在你的View模型中创建一个类似这样的SingleLiveEvent:然后:

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

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

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

在你的视图模型中处理onStart和onStop,你可以很容易地使用Lifecycle-Aware组件。

在你的视图中添加观察者,将实现 "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
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.