Я пытаюсь наблюдать за аутентификацией Firebase и соответствующим образом обновлять мой вид.
I have an SessionStore object:
class SessionStore: ObservableObject {
@Published var session: Account?
var handle: AuthStateDidChangeListenerHandle?
deinit {
stopListen()
}
func listen() {
if handle == nil {
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
if let user = user {
print("User logged in: \(user)")
self.session = Account.preData
} else {
self.session = nil
}
}
}
}
func stopListen() {
if let handle = handle {
Auth.auth().removeStateDidChangeListener(handle)
}
}
}
Я использую его в виде, подобном этому:
struct TabBarView: View {
@EnvironmentObject var sessionStore: SessionStore
@State var selectedTab = Tab.swiping
enum Tab: Int {
case swiping, matches, profil
}
func getUser() {
sessionStore.listen()
}
var body: some View {
Group {
if (sessionStore.session != nil) {
TabView(selection: $selectedTab) {
SwipingView().tabItem {
TabBarItem(text: "Text", image: "pause.circle")
}.tag(Tab.swiping)
}
} else {
LoginView()
}
}.onAppear(perform: getUser).onDisappear(perform: sessionStore.stopListen)
}
}
И называю это так:
sessionStore = SessionStore()
TabBarView().environmentObject(sessionStore!)
Но он показывает только LoginView, даже когда сессия не равна нулю. Я сделал некоторые изменения кода, это на самом деле решение.