我试图使用SwiftUI的@Environment
属性包装器,但我无法使其按照我的预期工作。请帮助我理解我做错了什么。
例如,我有一个对象,它每秒钟产生一个整数:
class IntGenerator: ObservableObject {
@Published var newValue = 0 {
didSet {
print(newValue)
}
}
private var toCanc: AnyCancellable?
init() {
toCanc = Timer.TimerPublisher(interval: 1, runLoop: .main, mode: .default)
.autoconnect()
.map { _ in Int.random(in: 0..<1000) }
.assign(to: \.newValue, on: self)
}
}
这个对象按预期工作,因为我可以在控制台日志中看到所有生成的整数。现在,假设我们希望该对象成为一个环境对象,可从应用程序的任何位置以及任何人访问。让我们创建相关的环境键:
struct IntGeneratorKey: EnvironmentKey {
static let defaultValue = IntGenerator()
}
extension EnvironmentValues {
var intGenerator: IntGenerator {
get {
return self[IntGeneratorKey.self]
}
set {
self[IntGeneratorKey.self] = newValue
}
}
}
现在我可以像这样访问这个对象(例如从视图中):
struct TestView: View {
@Environment(\.intGenerator) var intGenerator: IntGenerator
var body: some View {
Text("\(intGenerator.newValue)")
}
}
不幸的是,尽管newValue
是一个@Published
属性,但我没有收到该属性的任何更新,Text
始终显示0。我确定我在这里漏了什么,发生了什么?谢谢。
EnvironmentObject
是用于在视图层次结构中注入对象,并使这些对象在视图层次结构内的所有视图中可用。Environment
不严格相关于视图。它只是为了在您的项目中创建全局依赖项。当您创建一个Environment
依赖项时,您可以从应用程序中的所有实体(而不仅仅是视图)访问该依赖项。因此,我想了解是否可以观察Environment
对象中的Published
属性。 - superpuccioEnvironmentObject
和内部的ObservedObject
。视图没有更新,除非我将ObservedObject
更改为Published
。感谢您的提示。 - ramzesenok