如何在 SwiftUI 的应用程序文件中使用 EnvironmentObject

问题描述

是否可以在新的 SwiftUI 2.0 项目的应用程序文件中使用 EnvironmentObject?
我正在使用以下代码,但出现错误

致命错误:未找到身份验证类型的 ObservableObject。一种 用于身份验证的 View.environmentObject(_:) 可能缺少作为 此视图的祖先。:文件 SwiftUI,第 0 行

我假设这个错误是因为我还没有在任何视图中使用 .environmentObject 修饰符,所以 UserAuth 还没有被放置在环境中。

但我希望这个 loginStatus 在我的应用程序中的任何地方都可用,并且能够在我的应用程序的任何地方在 UserAuth 类的一个常见实例上使用函数 getLoginStatus。

我希望将它放在我的 rootView 中,并将其应用于所有视图,但不确定如何使用我的应用程序文件中的以下结构来执行此操作。

enum LoginStatus {
    case signedIn
    case signedOut
}

import SwiftUI

@main
struct ExampleApp: App {

    @EnvironmentObject var userAuth: UserAuth

    init() {
        userAuth.getLoginStatus()
    }
    
    var body: some Scene {
        WindowGroup {
            switch userAuth.loginStatus {
            case .signedIn:
                Text("Signed In")
            case .signedOut:
                Text("Signed Out")
            }
        }
    }
}

import SwiftUI

class UserAuth: ObservableObject {
    
    @Published var loginStatus: LoginStatus = .undetermined
    
    func getLoginStatus() {
        // asynchrounously set loginStatus
    }
}

解决方法

您可以将其用作该级别的常规属性,并在需要时将其作为环境传递到视图层次结构中,例如

struct ExampleApp: App {

    let userAuth = UserAuth()     // << here !!
    
    var body: some Scene {
        WindowGroup {
            switch userAuth.loginStatus {
            case .signedIn:
                ContentView()
                   .environmentObject(userAuth)    // << here !!
            case .signedOut:
                Text("Signed Out")
            }
        }
    }
}
,

您需要从根视图注入 UserAuth,并使用 View 属性访问 @EnvironmentObject 中的对象。

import SwiftUI

@main
struct ExampleApp: App {

    var body: some Scene {
        WindowGroup {
            MainView().environmentObject(UserAuth())
        }
    }
}


class UserAuth: ObservableObject {
    
    @Published var loginStatus: LoginStatus = .undetermined
    
    func getLoginStatus() {
        // asynchrounously set loginStatus
    }
    
    enum LoginStatus {
        case undetermined
    }
}

struct MainView:View{
    var body: some View{
        Text("")
    }
}

struct MainView1:View{
    
    @EnvironmentObject var userAuth: UserAuth
    
    var body: some View{
        Text("")
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...