无法从使用函数构造的子视图访问@EnvironmentObject

Unable to access @EnvironmentObject from a child view constructed with a function

我正在尝试将 EnvironmentObject 传递给子视图,但我对以下代码不满意。

struct ContentView: View {
  enum MyViews: Int, CaseIterable {

    case introView
    case viewOne
    case viewTwo

    var activeView: AnyView {
      switch self.rawValue {
        case 0: return AnyView(IntroView())
        case 1: return AnyView(ViewOne())
        case 2: return AnyView(ViewTwo())
        default: return AnyView(IntroView())
      }
    }

    @State var pageIndex = 0

    func content() -> MyViews? {
        let newPage = MyViews.init(rawValue: pageIndex)
        return newPage
    }
}

var body: some View {
   Group {
    content()?.activeView // Problem appears to lie here
   }
   .environmentObject(userData)
}

如果我用简单的视图替换 content()?.activeView,例如TestView() 然后我就能够在 TestView() 中成功打印出 userData 变量。但就目前而言,我在尝试访问 ViewOne() 中的 userData 时遇到崩溃,即使 ViewOne 与 TestView() 相同。

知道我做错了什么吗?

问题是您需要通过 init() 手动将 EnvironmentObject 传递给您的 viewModel。它不会自动注入。这是一种方法

func getActiveView(userData: UserData) -> AnyView {
    switch self.rawValue {
    case 0: return AnyView(IntroView(userData: userData))
      case 1: return AnyView(ViewOne())
    default: return AnyView(IntroView(userData: userData))
    }
}

在您的 ContentView 视图中调用函数并传递 userData

ZStack {
    content()?
        .getActiveView(userData: userData)
        .environmentObject(userData)
}

IntroView 和 ViewModel 以 userData 为参数

class AListViewModel: ObservableObject {
    
    var userData: UserData
    init(userData: UserData) {
        self.userData = userData
    }

    func myFunc(){
        print("myVar: \(userData.myVar)")
    }
}

struct IntroView: View {
    @EnvironmentObject var userData: UserData
    
    @ObservedObject var someListVM : AListViewModel
    
    init(userData: UserData) {
        someListVM = AListViewModel(userData: userData)
    }