微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Firebase用户的显示名称在SwiftUI视图中返回空字符串

如何解决Firebase用户的显示名称在SwiftUI视图中返回空字符串

我正在使用SwiftUI和Firebase制作Food Delivery App,并且已经能够实现电子邮件/密码身份验证。我有一个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().currentUser属性传递给user

解决方法

我认为我发现了错误。在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设置为""。糟糕!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。