首页 > 解决方案 > Firebase 用户的显示名称在 SwiftUI 视图中返回一个空字符串

问题描述

我正在使用 SwiftUI 和 Firebase 制作一个送餐应用程序,并且我已经能够实现电子邮件/密码身份验证。我有一个 ProfileView 来显示用户名和他们拥有的供应商。但是,当我尝试访问用户的 displayName 属性时,它只返回一个空字符串。有什么方法可以从 Firebase 控制台访问或更改用户的显示名称。

ProfileView.swift

struct ProfileView: View {
    var user: User?
    @ObservedObject var vendorRepo = VendorRepository()
    
    var body: some View {
        VStack(alignment: .center) {
            Text("Profile")
                .font(.largeTitle)
                .bold()
            
            ImageView(imageName: "examplePP", width: 100, height: 100)
            
            Text(user?.displayName ?? "No Username Provided")
                .font(.title)
            
            Divider()
            
            NavigationView {
                List(vendorRepo.userOwnedVendors) { vendor in
                    NavigationLink(destination: VendorView(vendor: vendor)) {
                        VendorRow(vendor: vendor)
                    }
                }
                .navigationBarTitle(Text("Vendors Owned by You"), displayMode: .inline)
            }
        }
        .padding(.top, -25.0)
        .onAppear() {
            self.vendorRepo.readUserOwnedVendors()
        }
    }
}

EmailSignUpView.swift

struct EmailSignUpView: View {
    @State var displayName: String = ""
    @State var email: String = ""
    @State var password: String = ""
    
    var body: some View {
        VStack(alignment: .center, spacing: 20) {
            VStack {
                Text("Sign Up with Email")
                    .font(.largeTitle)
                    .bold()
                
                Text("You must have an account to be able to start a vendor or modify your existing ones. If you already have an account, go to the Login Page.")
                    .multilineTextAlignment(.center)
            }
            
            Spacer()
            
            VStack(alignment: .center) {
                Text("Enter your Display Name:")
                TextField("Display Name", text: $displayName)
                    .disableAutocorrection(true)
                    .autocapitalization(.none)
                    .multilineTextAlignment(.center)
            }
            
            VStack(alignment: .center) {
                Text("Enter your Email:")
                TextField("Email Address", text: $email)
                    .disableAutocorrection(true)
                    .autocapitalization(.none)
                    .multilineTextAlignment(.center)
            }
            
            VStack(alignment: .center) {
                Text("Enter your Password:")
                SecureField("Password", text: $password)
                    .disableAutocorrection(true)
                    .autocapitalization(.none)
                    .multilineTextAlignment(.center)
            }
            
            Spacer()

            Button(action: createAccount) {
                Text("Sign Up")
                    .font(.title)
            }
            
            Spacer()
        }
        .padding(.horizontal)
    }
    
    func createAccount() {
        Auth.auth().createUser(withEmail: self.email, password: self.password, completion: {result, error in
            var contentTitleString: String = ""
            var contentSubtitleString: String = ""
            
            if let error = error {
                print(error)
                contentTitleString = "Sign Up Failed!"
                contentSubtitleString = error.localizedDescription
                self.password = ""
            } else {
                print("\(self.email) has been signed up!")
                contentTitleString = "Sign Up Successful!"
                contentSubtitleString = "Please restart the app for changes to take place"
                self.displayName = ""
                self.email = ""
                self.password = ""
                if let currentUser = Auth.auth().currentUser?.createProfileChangeRequest() {
                    currentUser.displayName = self.displayName
                    currentUser.commitChanges(completion: {error in
                        if let error = error {
                            print(error)
                        } else {
                            print("DisplayName changed")
                        }
                    })
                }
            }
            
            let content = UNMutableNotificationContent()
            content.title = contentTitleString
            content.subtitle = contentSubtitleString
            content.sound = .default

            // show this notification one seconds from now
            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.1, repeats: false)
            let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
            
            UNUserNotificationCenter.current().add(request)
        })
    }
}

当我调用 ProfileView 视图时,我传递Auth.auth().currentUseruser属性。

标签: swiftxcodefirebaseswiftui

解决方案


我想我发现了错误。在 EmailSignUpView 的 createAcount() 函数中:

func createAccount() {
        Auth.auth().createUser(withEmail: self.email, password: self.password, completion: {result, error in
            var contentTitleString: String = ""
            var contentSubtitleString: String = ""
            
            if let error = error {
                print(error)
                contentTitleString = "Sign Up Failed!"
                contentSubtitleString = error.localizedDescription
                self.password = ""
            } else {
                print("\(self.email) has been signed up!")
                contentTitleString = "Sign Up Successful!"
                contentSubtitleString = "Please restart the app for changes to take place"
                self.displayName = ""
                self.email = ""
                self.password = ""
                if let currentUser = Auth.auth().currentUser?.createProfileChangeRequest() {
                    currentUser.displayName = self.displayName
                    currentUser.commitChanges(completion: {error in
                        if let error = error {
                            print(error)
                        } else {
                            print("DisplayName changed")
                        }
                    })
                }
            }
            
            let content = UNMutableNotificationContent()
            content.title = contentTitleString
            content.subtitle = contentSubtitleString
            content.sound = .default

            // show this notification one seconds from now
            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.1, repeats: false)
            let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
            
            UNUserNotificationCenter.current().add(request)
        })
    }

""我在更新之前将 displayName 设置为。哎呀!


推荐阅读