如何在 watchOS 6 中注入 .environment Object()
How to inject .environmentObject() in watchOS6
我想在 watchOS6 中创建 SwiftUI 视图时注入一个 EnvironmentObject。
但是由于 WKHostingController 需要具体类型,所以我无法执行以下操作 ContentView().environmentObject(UserData())
class HostingController: WKHostingController<ContentView> {
override var body: ContentView {
return ContentView().environmentObject(UserData())
}
}
此代码失败并出现以下错误:
Cannot convert return expression of type 'some View' to return type 'ContentView'
我见过这样的解决方法:
这似乎是一种 hack 而不是正确的解决方案。
我在 Twitter 上询问了一位 watchOS 工程师,他的回答是将 .environmentObject(UserData())
放在 ContentView()
的正文中。我尝试这样做,但 Xcode 报告错误。
那么有没有人找到同样的方法?
link 的解决方法使用 AnyView
,这是一个非常糟糕的主意。在 Apple 工程师的其他几个问题和推文中已经解释过,AnyView 只能用于叶视图,否则会严重影响性能。
至于第二个选项(把environmentObject
放在ContentView
里面),效果很好。这里有一个例子:
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")
}
}
}
}
我想在 watchOS6 中创建 SwiftUI 视图时注入一个 EnvironmentObject。
但是由于 WKHostingController 需要具体类型,所以我无法执行以下操作 ContentView().environmentObject(UserData())
class HostingController: WKHostingController<ContentView> {
override var body: ContentView {
return ContentView().environmentObject(UserData())
}
}
此代码失败并出现以下错误:
Cannot convert return expression of type 'some View' to return type 'ContentView'
我见过这样的解决方法:
我在 Twitter 上询问了一位 watchOS 工程师,他的回答是将 .environmentObject(UserData())
放在 ContentView()
的正文中。我尝试这样做,但 Xcode 报告错误。
那么有没有人找到同样的方法?
link 的解决方法使用 AnyView
,这是一个非常糟糕的主意。在 Apple 工程师的其他几个问题和推文中已经解释过,AnyView 只能用于叶视图,否则会严重影响性能。
至于第二个选项(把environmentObject
放在ContentView
里面),效果很好。这里有一个例子:
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")
}
}
}
}