You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:50:24