我正在尝试使用 @Obervable 协议与多个视图共享数据,但无法使其正常工作。
我创建了一个简单的应用程序来演示我遇到的问题,您将会看到。 它包括:
我遇到的麻烦是将数据传递到“SecondView” 在 ContentView 内一切正常,但在 ContentView 之外就不行了。
有人可以看一下这个简单的代码并告诉我哪里出错了。
皮特
DemoApp.swift
import SwiftUI
@main
struct DemoApp: App {
@State private var data = ModelData()
var body: some Scene {
WindowGroup {
ContentView()
.environment(data)
}
}
}
ContentView.swift
import SwiftUI
struct ContentView: View {
@Bindable var data = ModelData()
var body: some View {
NavigationStack {
VStack {
TextField("Value", text: $data.value)
Text("\(data.value)")
NavigationLink {
SecondView()
.onAppear() {
data.Compute()
}
} label: {
Text("Button")
}
}
}
}
}
#Preview {
ContentView()
}
模型.swift
import Foundation
import Observation
@Observable
class ModelData {
var value = ""
func Compute() {
print(self.value)
}
}
SecondView.swift
import SwiftUI
struct SecondView: View {
var data = ModelData()
var body: some View {
Text("You Typed: \(data.value)")
}
}
#Preview {
SecondView()
}
尝试这个方法:
import Foundation
import SwiftUI
struct ContentView: View {
@Environment(ModelData.self) var data // <--- here
var body: some View {
@Bindable var data = data // <--- here
NavigationStack {
VStack {
TextField("Value", text: $data.value)
Text("\(data.value)")
NavigationLink {
SecondView()
.onAppear() {
data.Compute()
}
} label: {
Text("Button")
}
}
}
}
}
@Observable
class ModelData {
var value = ""
func Compute() {
print(self.value)
}
}
struct SecondView: View {
@Environment(ModelData.self) var data // <--- here
var body: some View {
Text("You Typed: \(data.value)")
}
}
请参阅此链接在应用程序中管理模型数据