簡體   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