首页 > 解决方案 > SwiftUI 线程 1:致命错误:未找到 SessionStore 类型的 ObservableObject

问题描述

我正在创建一个包含 Firebase 的 SwiftUI 应用程序以启用登录帐户,非常简单。但是当我运行此代码时,出现以下错误“SwiftUI 线程 1:致命错误:未找到 SessionStore 类型的 ObservableObject。” 调用 session.session 时弹出,你能告诉我这段代码的错误在哪里吗?多谢你们

import UIKit
import SwiftUI
import Firebase
import Combine

struct ContentView: View {
    
    @EnvironmentObject var session: SessionStore
    
    func getUser () {
        session.listen()
     }
    
    var body: some View{
            VStack {
                if session.session != nil {
                    LoginView()
                }
                else{
                    TabView {
                        ProfilView()
                            .tabItem {
                                Label("Profil", systemImage: "person")
                            }
                        
                        NotificationsView()
                            .tabItem {
                                Label("Notifications", systemImage: "bell")
                            }
                    }
                }
            }
            .onAppear(perform: getUser)
    }
}

struct ContentView_Previews: PreviewProvider {

    static var previews: some View {
        ContentView().environmentObject(SessionStore())
    }
}


这里的 SessionStore 模型:


import Combine
import Foundation
import Firebase

final class User {
    @Published var uid: String
//    var email: String?
    @Published var displayName: String?

    init(uid: String, displayName: String?) {
        self.uid = uid
//        self.email = email
        self.displayName = displayName
    }

}

final class SessionStore: ObservableObject {
    
   @Published var session: User?
   @Published var handle: AuthStateDidChangeListenerHandle?

   func listen () {
       // monitor authentication changes using firebase
       handle = Auth.auth().addStateDidChangeListener { (auth, user) in
           if let user = user {
               // if we have a user, create a new user model
               print("Got user: \(user)")
               self.session = User(
                   uid: user.uid,
                   displayName: user.displayName
               )
           } else {
               // if we don't have a user, set our session to nil
               self.session = nil
           }
       }
   }
}

标签: swiftfirebasegoogle-cloud-firestoreswiftui

解决方案


您需要.environmentObject(SessionStore())在实例化的任何地方包括ContentView

ContentView().environmentObject(SessionStore())

这需要在任何ContentView使用的地方发生(例如在预览和实际的应用程序层次结构本身中,例如来自SceneDelegateWindowGroup如果您正在使用 SwiftUI 视图生命周期)。


推荐阅读