SwiftUI运行报No ObservableObject of type Session found错误如何解决?
问题原因
- 你在
App结构体中直接使用@EnvironmentObject声明Session类型属性是错误的:@EnvironmentObject只能从已经存在的视图树环境中读取注入的对象,而App是整个应用的根入口,不存在上层视图给它注入Session实例,自然会触发找不到对象的崩溃。 - 你之前给视图加
.environmentObject修饰符不生效,本质是你根本没有创建过Session的实例,注入的前提是有可注入的实例对象。
修复步骤
- 首先确认你的
Session类已经遵守ObservableObject协议,完整的类定义开头应为:
class Session: ObservableObject { // 你原本的Session代码 }
- 修改你的
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
相关产品推荐
相关产品推荐

