在 SwiftUI 的 ViewModifier 中使用await关键字

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

有一个用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()
    }
}
swift swiftui actor combine
1个回答
0
投票

如果您必须使用

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