SwiftUI@ObservedBect未更新

SwiftUI@ObservedBect未更新,swiftui,firebase-remote-config,Swiftui,Firebase Remote Config,我有一个内容视图,其中显示或不显示基于从Firebase RemoteConfig获取的布尔值的文本。我试图在SecondView上传递布尔值,我希望它在ContentView上的布尔值更新时自己更新 class GlobalString: ObservableObject { @Published var isHidden = true } struct ContentView: View { @ObservedObject var globalString = Global

我有一个内容视图,其中显示或不显示基于从Firebase RemoteConfig获取的布尔值的文本。我试图在SecondView上传递布尔值,我希望它在ContentView上的布尔值更新时自己更新

class GlobalString: ObservableObject {
    @Published var isHidden = true
}

struct ContentView: View {
    @ObservedObject var globalString = GlobalString()
    
func updateUI(newUI: Bool) {
    if newUI {
        globalString.isHidden = false
    }
    else {
        globalString.isHidden = true
    }
}
func fetchValues() {
        let value = self.remoteConfig.configValue(forKey: "show_boost").boolValue
        updateUI(newUI: value)
    }
    
    init() {
        fetchValues()
    }
    
    var body: some View {
    if !globalString.isHidden {
        Text("Not Hidden")
    else {
        Text("Hidden")
    }
  }
}
问题是,当我(通过RemoteConfig)更改ContentView上的布尔值时,SecondView中的布尔值没有更新。我不知道为什么

struct SecondView: View {
    
    @ObservedObject var globalString = GlobalString()

    var body: some View {
        VStack {
            if globalString.isHidden {
                Text("Hidden")
            else {
                Text("Not Hidden")
            }
         }
     }
  }
}


每个
@ObservedObject var globalString=globalString()
都是全局模型的单独实例

一个人看不见另一个人在做什么

class GlobalString: ObservableObject {
    @Published var isHidden = true
    
    init() {
        fetchValues()
    }
    //This kind of stuff shouldn't be in a View it can't be shared/reused.
    func fetchValues() {
        let value = self.remoteConfig.configValue(forKey: "show_boost").boolValue
        updateUI(newUI: value)
    }
    
    func updateUI(newUI: Bool) {
        if newUI {
            self.isHidden = false
        }
        else {
            self.isHidden = true
        }
    }
}
struct SampleUpdateParentView: View {
    //@ObservedObject is for when then instance is initialized in another View
    @StateObject var globalString = GlobalString()
    
    var body: some View {
        //This is how you share an instance
        SampleUpdateView().environmentObject(globalString)
        SecondView().environmentObject(globalString)
    }
}
struct SampleUpdateView: View {
    @EnvironmentObject var globalString: GlobalString
    var body: some View {
        if !globalString.isHidden {
            Text("Not Hidden")
        }else {
            Text("Hidden")
        }
    }
}
struct SecondView: View {
    @EnvironmentObject var globalString: GlobalString
    
    var body: some View {
        VStack {
            if globalString.isHidden {
                Text("Hidden")
            }else {
                Text("Not Hidden")
            }
        }
    }
}
您也可以使用单例(不太推荐),只需在
类GlobalString
中更改/替换
init

static let shared = GlobalString()
private init() {
    fetchValues()
}
并将实例更改为引用
shared
变量

@StateObject var globalString = GlobalString.shared

将您的
@observedbjec
t更改为
@StateObject
谢谢您的回答。当我尝试您的代码时,出现以下错误:“线程1:致命错误:找不到GlobalString类型的ObservableObject。GlobalString的View.environmentObject(:)可能作为此视图的祖先丢失。”您必须使用
.environmentObject(GlobalString)将其传递到下一行
就像在
SampleUpdateParentView
中一样,如果在不添加环境对象初始值设定项的情况下初始化
SampleUpdateView()
SecondView()
而初始化
SampleUpdateView()。在这种情况下,Singleton是您的最佳选择。请参阅代码以了解您需要进行的更改。