我需要在MVVM中获取用户身份验证状态.在存储库中,我执行以下操作:
override fun getAuthResponse() = callbackFlow {
val listener = AuthStateListener {
Log.d(TAG, "currentUser: " + (currentUser == null)) //Line2
trySend(it.currentUser == null)
}
auth.addAuthStateListener(listener)
awaitClose {
auth.removeAuthStateListener(listener)
}
}
"Line2"将始终打印true
,因为用户未经过身份验证.然后,在ViewModel中,我拥有:
fun getAuthResponse() = repo.getAuthResponse()
和内部活动:
setContent {
//...
val response = viewModel.getAuthResponse().collectAsState(initial = false).value
Log.d(TAG, "response: $response") //Line1
}
因为setContent是一个可组合的函数,所以当我打开应用程序时,它会触发两次.这意味着"Line1"处的LOG语句被触发两次.当它第一次开火时,我会得到:
response: false
currentUser: true
因此,即使我在前一行调用了getAuthResponse(),响应也是在前面打印的.问题是,出于某种原因,即使当前用户为空,我也会在活动中得到该用户不为空的消息.当它第二次emits 时,我得到了正确的数据:
response: true
currentUser: true
为什么我会得到一个非空的用户对象?try 发送是否会发出虚假数据?