我的程序产生错误:
Thread 1: Fatal error: No ObservableObject of type Variables found. A View.environmentObject(_:) for Variables may be missing as an ancestor of this view.
,我不太明白这个错误意味着什么。
这是产生错误的代码的最小可重现示例:
import SwiftUI
struct ContentView: View {
@StateObject var storage = Variables()
var body: some View {
AddToScore()
VStack {
Button("remove points") {
storage.score -= 1
}
Text("text text etxt dfahjadfbadful")
}.environmentObject(storage)
}
}
struct AddToScore: View {
@EnvironmentObject var storage: Variables
var body: some View {
VStack {
Text("Point generator")
.font(.title)
HStack {
Button("Get points!") {
storage.score += 1
}
Text("\(storage.score)")
}
}
}
}
class Variables: ObservableObject {
@Published var score = 0
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
问题是
.environmentObject(storage)
不在AddToScore()的范围内。他们都处于“同一水平”。 .environmentObject(storage)
需要处于以上级别。像这样:
struct ContentView: View {
@StateObject var storage = Variables()
var body: some View {
VStack {
AddToScore() // AddToScore() needs to be a level below .environmentObject(storage).
Button("remove points") {
storage.score -= 1
}
Text("text text etxt dfahjadfbadful")
}.environmentObject(storage)
}
}
struct AddToScore: View {
@EnvironmentObject var storage: Variables
var body: some View {
VStack {
Text("Point generator")
.font(.title)
HStack {
Button("Get points!") {
storage.score += 1
}
Text("\(storage.score)")
}
}
}
}
class Variables: ObservableObject {
@Published var score = 0
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
您也可以直接在
.environmentObject(storage)
上添加 AddToScore()
(如 Umer Khan 的评论所示)。
AddToScore().environmentObject(storage)