线程 1:致命错误:找不到 Bar 类型的 ObservableObject

问题描述 投票:0回答:1

我的程序产生错误:

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()
    }
}
swiftui swiftui-environment
1个回答
3
投票

问题是

.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)
© www.soinside.com 2019 - 2024. All rights reserved.