我正在使用 Firebase 和 SwiftUI 以用户身份登录。我一切正常,但无法弄清楚用户成功登录后如何导航到下一页。导航链接对我来说似乎很奇怪,所以我想知道是否有其他方法可以导航到下一个视图。这LoginView
包含登录屏幕和LoginViewModel
使用 Firebase 执行登录过程。问题是,如果我基于根视图中的变量返回视图,那么一旦打开根视图以外的任何视图,它就不会更改视图(即,如果我导航到登录视图,它不会转到按下登录按钮后的主视图)。
ContentView(显示所有其他视图的根视图):
import SwiftUI
struct ContentView: View {
@StateObject var userLoggedIn = LoginViewModel()
var body: some View {
if !userLoggedIn.isLoggedIn {
LoginView()
}
else {
MainView()
}
}
}
登录查看:
import SwiftUI
import FirebaseAuth
struct LoginView: View {
@State private var email: String = ""
@State private var password: String = ""
@State private var isEditing = false
@State private var showPassword = false
@State private var radius = 300
private var canLogIn: Bool {
return !email.isEmpty && !password.isEmpty
}
let loginView = LoginViewModel()
@ViewBuilder
var body: some View {
return NavigationView(content: {
VStack {
Spacer()
.frame(height: 150)
Text("PET SUPPORT").foregroundColor(Color.petSupportText)
.font(Font.custom("Permanent Marker", size: 36))
.padding()
Group {
HStack {
Text("EMAIL")
.font(Font.custom("Permanent Marker", size: 18))
.padding(.top, 10)
Spacer()
}
TextField("Email", text: $email) {
isEditing in self.isEditing = isEditing
}
.autocapitalization(.none)
.keyboardType(.emailAddress)
.disableAutocorrection(true)
.padding(.top, 20)
Divider()
.foregroundColor(.black)
}
Group {
HStack {
Text("PASSWORD")
.font(Font.custom("Permanent Marker", size: 18))
.padding(.top, 10)
Spacer()
}
ZStack {
if showPassword {
TextField("Password", text: $password)
}
else {
SecureField("Password", text: $password)
}
}
.frame(height: 20)
.autocapitalization(.none)
.overlay(Image(systemName: showPassword ? "eye.slash" : "eye").onTapGesture { showPassword.toggle() }, alignment: .trailing)
.disableAutocorrection(true)
.padding(.top, 20)
Divider()
.foregroundColor(.black)
}
Spacer();
Group {
Button(action: {
loginView.login(email: email, password: password)
radius = 2000
MainView()
}, label: {
Text("Login")
})
.foregroundColor(.white)
.font(Font.custom("Permanent Marker", size: 18.0))
.padding(.horizontal, 20)
.padding()
.background(Color.petSupportBlue)
.cornerRadius(70.0)
.disabled(!canLogIn)
}
Spacer()
}
.padding(.horizontal, 30)
.ignoresSafeArea()
})
}
}
登录视图模型:
import Foundation
import Firebase
class LoginViewModel: ObservableObject {
@Published var isLoggedIn = false
func login(email: String, password: String) {
Auth.auth().signIn(withEmail: email, password: password) { (result, error) in
if let error = error {
print(error.localizedDescription)
} else {
print("Logged In!")
self.isLoggedIn = true
}
}
}
}
主视图:
import SwiftUI
struct MainView: View {
var body: some View {
Text("Hello, World!")
}
}