“无法在范围内找到用户”SwiftUI Xcode错误

ukxgm1gy  于 2022-12-24  发布在  Swift
关注(0)|答案(1)|浏览(120)

我正在为我的移动的应用创建身份验证流。我收到错误:“无法在“self.userSession = user”&“.document(.user.uid)”上的范围“”中找到用户“我不确定如何解决此错误。如有任何帮助,将不胜感激!
'

import SwiftUI
import Firebase
import FirebaseCore
import FirebaseAuth
import FirebaseStorage
import FirebaseFirestore
import FirebaseFirestoreSwift

class AuthViewModel: ObservableObject {
    @Published var userSession: FirebaseAuth.User?
    
    init() {
        self.userSession = Auth.auth().currentUser
        
        print("DEBUG: User session is \(self.userSession?.uid)")
    }
    
    func login(withEmail email: String, password: String) {
        Auth.auth().signIn(withEmail: email, password: password) { result, error in
            if let error = error {
                print("DEBUG: Failed to sign in with error \(error.localizedDescription)")
                return
            }
            
            guard let user = result?.user else { return }
            self.userSession = user
            print("DEBUG: Did log user in..")
        }
    }
    
    func register(withEmail email: String, password: String, fullname: String) {
        Auth.auth().createUser(withEmail: email, password: password) { result, error in
            if let error = error {
                print("DEBUG: Failed to register with error \(error.localizedDescription)")
                return
            }
            
            print("DEBUG: Registered user successfully.")
            print("DEBUG: User is \(self.userSession)")
            
            let data = ["email": email,
                        "fullname": fullname,
                        "uid": user.uid]
            
            Firestore.firestore().collection("users")
                .document(user.uid)
                .setData(data) { _ in
                    print("DEBUG: Did upload user data..")
                }
        }
    }
    
    func signOut() {
        // sets user session to nil so we show login view
        userSession = nil
        
        // signs user out on server
        try? Auth.auth().signOut()
    }
}

'
我试过将声明上移到视图模型中,但这导致了另一个错误:“在范围”中找不到结果。

xeufq47z

xeufq47z1#

你应该使用一个auth状态改变监听器来保存用户会话,就像Firebase文档中提到的那样。你也不应该每次都在每个函数中初始化auth对象。

import FirebaseAuth

class AuthViewModel: Observable Object {
    private let auth: Auth = Auth.auth() // You can also use dependency injection

    @Published var userSession: User?

    private var authStatusHandler: AuthStateDidChangeListenerHandle?

    func addAuthStatusListener() {
        if let handle = authStatusHandler {
            auth.removeStateDidChangeListener(handle)
        }
    
        authStatusHandler = auth.addStateDidChangeListener { _, user in
            self.userSession = user
        }
    }

    ...
}

在register函数中,您尝试访问在login函数中定义的“user”变量。此变量超出了register函数的作用域。您应该使用register函数类中的userSession。

func register(withEmail email: String, password: String, fullname: String) {
    ...
        
        let data = ["email": email,
                    "fullname": fullname,
                    "uid": userSession.uid] // <- Here
        
        Firestore.firestore().collection("users")
            .document(userSession.uid) // <- Here
            .setData(data) { _ in
                print("DEBUG: Did upload user data..")
            }
    ...
}

相关问题