【问题标题】:Swift Fatal error: No ObservableObject of type Session foundSwift 致命错误:未找到 Session 类型的 ObservableObject
【发布时间】:2021-10-24 05:13:13
【问题描述】:

线程 1:致命错误:未找到 Session 类型的 ObservableObject。 Session 的 View.environmentObject(_:) 作为该视图的祖先可能会丢失。

我目前正在开发一个使用 Firebase 进行身份验证的 SwiftUI 应用程序。如果用户未登录,我想将他们带到登录页面,如果他们已登录,我希望他们转到正确的应用程序视图。这采用带有几个选项卡的 WindowGroup 的形式。

因为我有用户,所以我有一个会话存储的概念,它可以跟踪当前用户的会话。相当简单的类。

    let auth = Auth.auth()
    
    @Published var signedIn = false
    
    var isSignedIn: Bool {
        return auth.currentUser != nil
    }
    
    func login(email: String, password: String) {
        auth.signIn(withEmail: email, password: password) { [weak self] res, err in
            guard res != nil, err == nil else {
                return
            }
            
            DispatchQueue.main.async {
                self?.signedIn = true
            }
        }
    }
    
    func register(email: String, password: String) {
        auth.createUser(withEmail: email, password: password) { [weak self] res, err in
            guard res != nil, err == nil else {
                return
            }
            
            DispatchQueue.main.async {
                self?.signedIn = true
            }
        }
    }
}

在尝试运行我的应用程序时,我收到以下错误。

线程 1:致命错误:未找到 Session 类型的 ObservableObject。 Session 的 View.environmentObject(_:) 作为该视图的祖先可能会丢失。

struct app: App {
    @State var show = true
    
    init() {
        FirebaseApp.configure()
        UITabBar.appearance().barTintColor = UIColor(Color("Shallow"))
    }
    
    @EnvironmentObject var session: Session

    var body: some Scene {
        WindowGroup {
            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()
            }
        }
    }
}

我觉得这可能与需要将.environmentObject 添加到我的窗口组中的每个单独视图有关。这产生了相同的结果。我也尝试过直接将此环境对象添加到窗口组,但没有这样的运气。有人对我在这里可能遗漏的内容有任何想法吗?

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    你得到的错误是因为你在传入之前没有实例化 Session()。试试这样的:

    @main
    struct app: App {
        @State var show = true
        @StateObject var session = Session()  // <--- here
        
        init() {
            FirebaseApp.configure()
            UITabBar.appearance().barTintColor = UIColor(Color("Shallow"))
        }
    
        var body: some Scene {
            WindowGroup {
                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")
                        }
                    }
                    .environmentObject(session)  // <--- here
                    .accentColor(Color("Rye"))
                    
                } else {
                    LoginView()
                      .environmentObject(session) // <-- if you use it in this class
                }
            }
        }
    }
    

    然后在你的 DiscoverView()、CollectorView() 等...添加

    @EnvironmentObject var session: Session
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2020-05-11
      • 2014-08-11
      • 2017-07-27
      相关资源
      最近更新 更多