这是我的 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)
如何监听仓库类中的权限变化?还是有其他解决方案?
在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
}
}