swift - 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().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 设置为。哎呀!
推荐阅读
- php - Laravel PayPal 错误:购物车项目总金额与订单金额不匹配
- python - SQLAlchemy 在单个查询中加载多个 orm 模型?
- java - Hibernate 只执行 java 属性的第一个自定义约束
- ios - 如何在 Xcode 12 中调试 iOS 14 小部件?
- reactjs - 如何确定是否可以使用 react-router 执行 goBack() 或 goForward()?
- fortran - 在没有 c$omp& 指令的情况下使用 gfortran 编译
- swift - SwiftUI 将数据传递给子视图
- react-native - 无法检查/与 iOS 交互在 Appium 中反应原生应用程序元素
- python - 如何抓取zomato上的所有href?
- python - 将值附加到列内的列表操作所有行而不是一个