Geo*_*e B 6 ios firebase swift firebase-authentication swiftui
我按照本教程将 Firebase 用户身份验证添加到我的 SwiftUI 项目中。当用户登录或注册时,登录视图应该消失,而应该出现显示“登录成功”的文本。然而,这不会发生。登录/注册过程似乎有效,但视图没有改变,我怀疑EnvironmentalObject. 有没有人对为什么会发生这种情况有一些想法?谢谢!
这是我的一些代码 -
AppDelegate.swift
...
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: ContentView().environmentObject(SessionStore()))
self.window = window
window.makeKeyAndVisible()
}
}
...
Run Code Online (Sandbox Code Playgroud)
内容视图.swift
import SwiftUI
struct ContentView : View {
@EnvironmentObject var session: SessionStore
func getUser () {
session.listen()
}
var body: some View {
VStack {
if (session.session == nil) {
SignInView()
} else {
Text("Login successful!")
}
}.onAppear {
self.getUser()
}
}
}
Run Code Online (Sandbox Code Playgroud)
登录视图.swift
import SwiftUI
struct SignInView : View {
@State var email: String = ""
@State var password: String = ""
@State var loading = false
@State var error = false
@State var signInWorked = ""
@EnvironmentObject var session: SessionStore
func signIn () {
loading = true
error = false
session.signIn(email: email, password: password) { (result, error) in
self.loading = false
if error != nil {
self.error = true
} else {
self.email = ""
self.password = ""
self.signInWorked = "Signed In!"
}
}
}
func signUp () {
loading = true
error = false
session.signUp(email: email, password: password) { (result, error) in
self.loading = false
if error != nil {
self.error = true
} else {
self.email = ""
self.password = ""
self.signInWorked = "Signed In!"
}
}
}
var body: some View {
VStack {
TextField("Email Adress", text: $email)
SecureField("Password", text: $password)
if (error) {
Text("ahhh crap")
}
Button(action: signIn) {
Text("Sign in")
}
Button(action: signUp) {
Text("Sign Up")
}
Text(signInWorked)
}
}
}
Run Code Online (Sandbox Code Playgroud)
SessionStore.swift
import SwiftUI
import Firebase
import Combine
class SessionStore : ObservableObject {
var didChange = PassthroughSubject<SessionStore, Never>()
var session: User? { didSet { self.didChange.send(self) }}
var handle: AuthStateDidChangeListenerHandle?
func listen () {
// monitor authentication changes using firebase
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
if let user = user {
// if we have a user, create a new user model
print("Got user: \(user)")
self.session = User(
uid: user.uid,
displayName: user.displayName,
email: user.email)
} else {
// if we don't have a user, set our session to nil
self.session = nil
}
}
}
func signUp(
email: String,
password: String,
handler: @escaping AuthDataResultCallback
) {
Auth.auth().createUser(withEmail: email, password: password, completion: handler)
}
func signIn(
email: String,
password: String,
handler: @escaping AuthDataResultCallback
) {
Auth.auth().signIn(withEmail: email, password: password, completion: handler)
}
func signOut () -> Bool {
do {
try Auth.auth().signOut()
self.session = nil
return true
} catch {
return false
}
}
func unbind () {
if let handle = handle {
Auth.auth().removeStateDidChangeListener(handle)
}
}
}
Run Code Online (Sandbox Code Playgroud)
用户.swift
import Foundation
class User {
var uid: String
var email: String?
var displayName: String?
init(uid: String, displayName: String?, email: String?) {
self.uid = uid
self.email = email
self.displayName = displayName
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您需要将属性包装器添加@Published到您var session的 SessionStore 中,以确保在更改时刷新所有使用它的视图。所以改变
var session: User? { didSet { self.didChange.send(self) }}
到
@Publishedvar session: User? { didSet { self.didChange.send(self) }}
有关更多信息,请参见此处:https : //www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-data-between-views
| 归档时间: |
|
| 查看次数: |
4393 次 |
| 最近记录: |