无法从使用函数构造的子视图访问@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)
}
我正在尝试将 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)
}