如何在watchOS6中注入.environmentObject()

时间:2019-08-19 14:52:58

标签: swift swiftui watchos-6

我想在watchOS6中创建SwiftUI视图时注入一个EnvironmentObject。

但是由于WKHostingController期望使用具体类型,所以我无法执行以下ContentView().environmentObject(UserData())

class HostingController: WKHostingController<ContentView> {
    override var body: ContentView {
        return ContentView().environmentObject(UserData())
    }
}

此代码失败,并出现以下错误:

  

无法将“某些视图”类型的返回表达式转换为“ ContentView”类型

我看到了这样的解决方法: Using environmentObject in watchOS似乎是hack,而不是适当的解决方案。

我在Twitter上问了一个watchOS工程师,他的回答是将.environmentObject(UserData())放在ContentView()的正文中。我尝试这样做,但是Xcode报告错误。

那么有没有人找到一种方法来做同样的事情?

1 个答案:

答案 0 :(得分:5)

链接中的解决方法使用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")
            }
        }
    }
}