如何解决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 举报,一经查实,本站将立刻删除。