SwiftUI - 如何创建全局@State变量?

6
在SwiftUI中,是否可以创建一个全局@State变量以跨多个Swift UI文件访问?
我研究了@EnvironmentObject变量,但似乎无法做到我想要的。

1
不存在全局的@State变量这种东西。EnvironmentObject是正确的方法。我建议您查看WWDC会议中的SwiftUI数据流程。那里解释得非常清楚。 - kontiki
顺便说一下,如果您在创建EnvironmentObject时遇到问题,请更新您的答案并附上一些代码,解释您想要实现什么。这样其他人就可以帮助您了。 - kontiki
感谢您的评论。我会参考WWDC会议。 - hudson
1个回答

7
从Beta 3版本开始,您不能创建顶级全局@State变量。编译器会发生故障。您可以将其放在结构体中,并创建结构体的实例以进行构建。但是,如果您实际上实例化了它,您将会得到一个运行时错误,例如:Accessing State<Bool> outside View.body
您可能正在寻找的是一种简单的方法来创建与BindableObject属性绑定的绑定。这个示例很好。
虽然可以创建Binding到全局变量,但不幸的是,这仍然无法满足您的需求。值将更新,但您的视图不会刷新(下面是代码示例)。
创建程序化Binding的示例:
var globalBool: Bool = false {
    didSet {
        // This will get called
        NSLog("Did Set" + globalBool.description)
    }
}

struct GlobalUser : View {

    @Binding var bool: Bool

    var body: some View {
        VStack {
            Text("State: \(self.bool.description)") // This will never update
            Button("Toggle") { self.bool.toggle() }
        }
    }
}

...
static var previews: some View {
    GlobalUser(bool: Binding<Bool>(getValue: { globalBool }, setValue: { globalBool = $0 }))
}
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接