我对iOS编程和SwiftUI还比较新手。我遇到了一个问题,尝试在我的应用程序中集成Firebase身份验证来管理用户。
现在登录和注销基本上都能工作,但问题是,在登录后,我的视图(有条件地呈现Google登录按钮或内容列表)不会重新渲染,因此即使我已登录,仍然看到登录按钮。
我设置了一个可观察的对象来保存我的身份验证状态,但不幸的是,它不会自动重新加载当前用户。因此,我设置了一个手动重新加载用户的函数,希望在登录时触发。这对于注销按钮有效,但是登录完成后在AppDelegate中,由于某种原因我无法访问reloadUser()函数。
我确信有更好的方法来解决这个问题,并感激任何帮助!
环境:
现在登录和注销基本上都能工作,但问题是,在登录后,我的视图(有条件地呈现Google登录按钮或内容列表)不会重新渲染,因此即使我已登录,仍然看到登录按钮。
我设置了一个可观察的对象来保存我的身份验证状态,但不幸的是,它不会自动重新加载当前用户。因此,我设置了一个手动重新加载用户的函数,希望在登录时触发。这对于注销按钮有效,但是登录完成后在AppDelegate中,由于某种原因我无法访问reloadUser()函数。
我确信有更好的方法来解决这个问题,并感激任何帮助!
环境:
final class UserData: ObservableObject {
@Published var showFavoritesOnly = false
@Published var qrTags = qrTagData
@Published var user: User? = Auth.auth().currentUser
func reloadUser() -> Void {
self.user = Auth.auth().currentUser
}
}
我想渲染的视图:
struct MyQuaggsList: View {
@EnvironmentObject private var userData: UserData
var body: some View {
Group {
if getLogInState() != nil {
VStack {
NavigationView {
List {
Toggle(isOn: $userData.showFavoritesOnly) {
Text("Show Favorites Only")
}
ForEach(userData.qrTags) { qrTag in
if !self.userData.showFavoritesOnly || qrTag.isFavorite {
NavigationLink(
destination: QuagDetail(qrTag: qrTag)
.environmentObject(self.userData)
) {
QuaggRow(qrTag: qrTag)
}
}
}
}
.navigationBarTitle(Text("My Quaggs"))
}
SignOutButton()
}
} else {
SignInView()
}
}.onAppear(perform: {self.userData.reloadUser()})
}
func getLogInState() -> User? {
return Auth.auth().currentUser
}
}
此外,请注意有一个.onAppear()函数,不幸的是它只会在初始出现时触发,而不会在用户登录后重新出现视图时触发。
非常感谢您提前的帮助!这一直让我很沮丧。
BindableObject
替换为ObservableObject
并使用户@Published
来改进 - 这将允许您获得自动状态处理。此外,无需实现自己的用户对象 - Firebase 的User
类已经具有您需要的大部分属性。请参阅 https://dev59.com/ebjna4cB1Zd3GeqP8VAN#60205753 以获取完整的实现,并了解 Firebase 如何处理用户身份验证的一些背景信息。 - Peter Friese