SwiftUI 线程 1:致命错误:未找到类型为 SessionStore 的 ObservableObject

Posted

技术标签:

【中文标题】SwiftUI 线程 1:致命错误:未找到类型为 SessionStore 的 ObservableObject【英文标题】:SwiftUI Thread 1: Fatal error: No ObservableObject of type SessionStore found 【发布时间】:2021-02-22 19:21:59 【问题描述】:

我正在创建一个包含 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
           
       
   


【问题讨论】:

您需要将 SessionStore 添加为 EnvironmentObject。 显示你在哪里初始化ContentView()——它需要有.environmentObject()和会话存储 谢谢@jnpdx ???????????? @jnpdx 看来您的信息解决了问题,请将其发布为答案。 【参考方案1】:

您需要在实例化ContentView 的任何位置包含.environmentObject(SessionStore())

ContentView().environmentObject(SessionStore())

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

【讨论】:

以上是关于SwiftUI 线程 1:致命错误:未找到类型为 SessionStore 的 ObservableObject的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 致命错误:未找到“”类型的 ObservableObject

SwiftUI iOS - 如何使用捕获的硬件按键事件

SwiftUI 错误未找到 GlobalEnvironment 类型的 ObservableObject

致命错误:仅从在线下载为 zip 时未找到“ZipArchive”类

未找到致命错误文件/词法预处理器错误 IOS

致命错误:未捕获的错误:未找到“Omnipay\Omnipay”类