You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI运行报No ObservableObject of type Session found错误如何解决?

问题原因
  • 你在App结构体中直接使用@EnvironmentObject声明Session类型属性是错误的:@EnvironmentObject只能从已经存在的视图树环境中读取注入的对象,而App是整个应用的根入口,不存在上层视图给它注入Session实例,自然会触发找不到对象的崩溃。
  • 你之前给视图加.environmentObject修饰符不生效,本质是你根本没有创建过Session的实例,注入的前提是有可注入的实例对象。
修复步骤
  1. 首先确认你的Session类已经遵守ObservableObject协议,完整的类定义开头应为:
class Session: ObservableObject {
    // 你原本的Session代码
}
  1. 修改你的App入口代码:
  • 删除原本的@EnvironmentObject var session: Session声明
  • 用@StateObject持有Session的实例(iOS 14+/macOS 11+适用,是SwiftUI中持有ObservableObject的标准方案)
  • 给WindowGroup的根视图注入这个实例

修改后的完整App代码如下:

struct app: App {
    @State var show = true
    // 新增:在App生命周期内持有Session实例
    @StateObject private var session = Session()
    
    init() {
        FirebaseApp.configure()
        UITabBar.appearance().barTintColor = UIColor(Color("Shallow"))
    }

    var body: some Scene {
        WindowGroup {
            Group { // 用Group包一层统一加修饰符
                if session.signedIn {
                    TabView {
                        NavigationView {
                            DiscoverView()
                        }
                        .tabItem {
                            Image("discover")
                            Text("Discover")
                        }
                        NavigationView {
                            CollectorView()
                        }
                        .tabItem {
                            Image("collection")
                            Text("Liquor")
                        }
                        NavigationView {
                            BottlesView()
                        }
                        .tabItem {
                            Image("store")
                            Text("Recipes")
                        }
                        NavigationView {
                            ListsView()
                        }
                        .tabItem {
                            Image("lists")
                            Text("Lists")
                        }
                        NavigationView {
                            ProfileView()
                        }
                        .tabItem {
                            Image("profile")
                            Text("Profile")
                        }
                    }
                    .accentColor(Color("Rye"))
                    
                } else {
                    LoginView()
                }
            }
            // 将Session实例注入到整个视图树,所有子视图都可通过@EnvironmentObject读取
            .environmentObject(session)
        }
    }
}
可选优化

可以在Session的初始化方法中直接同步当前的登录状态,避免启动时默认显示登录页再跳转的闪烁问题:

class Session: ObservableObject {
    let auth = Auth.auth()
    
    @Published var signedIn = false
    
    init() {
        // 初始化时直接读取当前已登录的用户状态
        signedIn = auth.currentUser != nil
    }
    
    // 你原本的login、register等其他代码
}

内容的提问来源于stack exchange,提问作者user11371080

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:27:04