I want to inject an EnvironmentObject while creating a SwiftUI view in watchOS6.
But since WKHostingController expects a Concrete type I am not able to do the following
The workaround from the link uses AnyView
, which is a very bad idea. It has been explained in several other questions and tweets from Apple engineers, that AnyView should only be used on leaf views, as there is a heavy performance hit otherwise.
As for the second option (put the environmentObject
inside ContentView
), it works fine. Here you have an example:
class UserData: ObservableObject {
@Published var show: Bool = true
}
struct ContentView: View {
@State var model = UserData()
var body: some View {
SubView().environmentObject(model)
}
}
struct SubView: View {
@EnvironmentObject var model: UserData
var body: some View {
VStack {
Text("Tap Me!").onTapGesture {
self.model.show.toggle()
}
if self.model.show {
Text("Hello World")
}
}
}
}