为何trySend会输出错误数据?MVVM用户认证状态获取异常
问题原因与解决方案
为什么首次会返回false?
这不是trySend发送了虚假数据,首次打印的false是你在collectAsState里设置的initial = false默认值,完整流程如下:
- Compose首次执行时,调用
collectAsState(initial = false),此时仓库层的Flow还没来得及发射任何数据,Compose只能先用你指定的初始值false,所以Line1先输出response: false。 - 随后仓库层的
callbackFlow完成初始化,添加AuthStateListener——Firebase Auth的监听器在被添加时会立即触发一次回调,同步当前的认证状态,所以Line2打印currentUser: true,同时trySend发射了正确的true值。 - Flow发射新值后,
collectAsState会更新状态,触发Composable重组,第二次执行Compose代码时,就能拿到Flow发射的true,所以Line1输出正确结果。
如何优化避免初始值误导?
可以在仓库层的Flow里,先主动发送一次当前的认证状态,不用等监听器回调:
override fun getAuthResponse() = callbackFlow { // 先同步发送当前的认证状态 trySend(auth.currentUser == null) val listener = AuthStateListener { Log.d(TAG, "currentUser: " + (it.currentUser == null)) trySend(it.currentUser == null) } auth.addAuthStateListener(listener) awaitClose { auth.removeAuthStateListener(listener) } }
这样当Flow被收集时,会第一时间发射真实的认证状态,Compose首次执行就能拿到正确值,不会再出现初始的false。
内容的提问来源于stack exchange,提问作者Always Learner
相关产品推荐
相关产品推荐

