swift - 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
}
}
}
}
解决方案
您需要.environmentObject(SessionStore())
在实例化的任何地方包括ContentView
:
ContentView().environmentObject(SessionStore())
这需要在任何ContentView
使用的地方发生(例如在预览和实际的应用程序层次结构本身中,例如来自SceneDelegate
或WindowGroup
如果您正在使用 SwiftUI 视图生命周期)。
推荐阅读
- visual-studio - 通过 Visual Studio 发布到 Google Cloud Compute Engine - 删除实时文件
- python - 使用 Python 将 JSON 数据列表导入 Postgresql
- visual-studio - 如何在 MFC 中为 CSocket 创建一个套接字数组?
- java - 由于 ExceptionInInitializerError,使用 ContextClassLoader 读取属性文件失败?
- javascript - 为什么 JavaScript 中的 parseInt 和 isNaN 行为不一致?
- python - Django 为 AutoField 添加前缀
- php - Woocommerce 3 中的可编辑管理员自定义计费字段错误问题
- angular - angulardart:将事件传递给另一个组件
- html - 如何更改移动设备的站点名称字体大小
- hive - 遇到“错误无法更改表”。在 Hive 中更改表列位置时