这是我的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变为null(用户已注销)时,我将相应地更新UI。它工作正常,但是对于MVVM,该活动了解Firebase,这不是正确的。我有这个结构:
Activity -> ViewModel - Repository (calls to Firebase)
如何在存储库类中侦听auth更改?还是有其他解决方案?
答案 0 :(得分:2)
在MVVM体系结构中,我们有一个事件驱动的体系结构,视图模型发出的一切都发生了,观察者在视图中获得了它(活动或片段) 在您的案例中,存储库会处理获取用户的问题,然后将其提供给视图模型,然后发出结果。 看看Google开发人员在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一次观察更改,因为诸如您的用户状态的情况只是在请求用户状态触发后才发生更改。 在您的View模型中创建一个像这样的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,您可以轻松使用支持生命周期的组件:
在您的视图中添加观察者,以了解将实现“ 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
}
}