我正在构建一个使用 Firebase 身份验证的 SwiftUI 应用,但在用户注销时遇到了导航问题。我的应用结构如下:
App.swift 中的根视图有条件地显示:如果未经身份验证则显示 WelcomeView,如果经过身份验证则显示 MainTabView
从 MainTabView 中,用户可以浏览多个嵌套的 NavigationLinks:
MainTabView → 设置(通过 NavigationLink)设置 → 帐户信息(通过 NavigationLink 或工作表)
帐户信息包含一个注销按钮当用户从深度嵌套的帐户信息屏幕注销时,Firebase 身份验证状态会正确更新(通过打印语句确认),但 UI 不会导航回 WelcomeView。
实施细节 使用 Firebase Auth 进行身份验证
我尝试 在 signOut 方法中明确设置 isAuthenticated = false
对 FireAuthManager 使用 @EnvironmentObject
尝试手动弹出到根目录(这在 SwiftUI 中效果不佳)
问题: 在使用深度嵌套的 NavigationLink 时,SwiftUI 中重置导航并在注销时返回欢迎屏幕的正确模式是什么?如何确保无论用户在导航堆栈中处于多深的位置,UI 都能正确响应身份验证状态的变化?
func signOut(comp: (Error?) -> Void) {
do {
try Auth.auth().signOut()
isProfileCompleted = nil
self.isAuthenticated = false
PresenceManager.shared.setOfflineOnLogout()
comp(nil)
print("User signed out successfully")
} catch let signOutError as NSError {
print("Error signing out: \(signOutError.localizedDescription)")
comp(signOutError)
}
}
NavigationStack {
Group {
if authManager.isAuthenticated == false {
WelcomeView()
} else {
MainTabView()
}
}
}
}