有一个用Actor制作的模型。 ButtonView 更改 Model 中的变量。 ColorView 根据模型变量值显示不同的颜色。
但是这个例子不起作用。 因为await关键字不能在ViewModifier中使用。
这个问题可以解决吗? 我错过了什么?
感谢您的阅读。
actor ActorModel: ObservableObject {
static let shared = ActorModel()
private init() {}
@Published var isActive: Bool = false
func toggleActive() {
isActive.toggle()
}
}
struct ContentView: View {
var body: some View {
VStack {
ColorView()
ButtonView()
}
.padding()
}
}
struct ColorView: View {
@ObservedObject private var model = ActorModel.shared
var body: some View {
VStack {
Rectangle()
.foregroundStyle(await model.isActive ? .red : .blue) // <-- Problem!
.frame(width: 100, height: 100)
}
.padding()
}
}
struct ButtonView: View {
@ObservedObject private var model = ActorModel.shared
var body: some View {
VStack {
Button("Toggle Color") {
Task {
await model.toggleActive()
}
}
}
.padding()
}
}
如果您必须使用
actor
那么您应该这样做:
struct ColorView: View {
@ObservedObject private var model = ActorModel.shared
@State private var color: Color = .gray //Default
var body: some View {
VStack {
Rectangle()
.foregroundStyle(color) // <-- Problem!
.frame(width: 100, height: 100)
}
.padding()
.onAppear {
Task {
color = await model.isActive ? .red : .blue
}
}
}
}