SwiftUI集成Firebase Auth:登出后重新登录视图不切换问题
问题分析与解决方案
问题根源
登出后再次登录无法切换视图的核心原因是:ContentView 中的 screenOn 作为 @State 变量,登出后会保留之前的值(即触发登出时的 1)。当用户再次登录时,currentUser 变为非空,ContentView 会根据 screenOn=1 渲染对应的视图,而该视图的 onAppear 方法会立即调用 signOut(),导致用户刚登录就被登出,表现为登录功能失效。
修复步骤
1. 重置登录后的视图状态
在 ContentView 中添加 onChange 修饰符,监听 currentUser 的变化,当用户登录(currentUser 变为非空)时,将 screenOn 重置为初始值 0:
struct ContentView: View { @State var screenOn = 0 @EnvironmentObject var authViewModel: AuthViewModel var body: some View { if let user = authViewModel.currentUser { if screenOn == 0 { someView(screenOn: $screenOn) .onAppear(perform: UIApplication.shared.addTapGestureRecognizer) .onOpenURL { url in let link = url.absoluteString } } else if screenOn == 1 { someView(screenOn: $screenOn) .onAppear { authViewModel.signOut() } } else if screenOn == 3 { someView(screenOn: $screenOn) } else if screenOn == 4 { someView(screenOn: $screenOn) } } else { Loginpage() } // 添加以下代码重置视图状态 .onChange(of: authViewModel.currentUser) { newUser in if newUser != nil { screenOn = 0 } } } }
2. 优化登出逻辑(可选)
确保 AuthViewModel 的 signOut 方法代码简洁性(同步方法无循环引用风险,但保持代码一致性):
func signOut() { do { try Auth.auth().signOut() } catch { self.error = error } }
修复效果验证
- 首次登录:
currentUser非空,screenOn=0,正常显示主页。 - 触发登出:
screenOn=1,调用signOut()后currentUser变为空,切换到登录页。 - 再次登录:
currentUser变为非空,screenOn被重置为0,正常显示主页,不会触发自动登出。
内容的提问来源于stack exchange,提问作者Nexteon
相关产品推荐
相关产品推荐

