[英]Why does SwiftUI not update a view here?
當 isConnected 更新時,下方 ReadyDashboardView 中的背景顏色和文本不會更新。 顯然,我想在建立連接時更新視圖。 我期待將鏈中的所有內容發布到該變量會使其在 swiftui 中立即更新。 相反,它總是使用實例化變量時提供的值進行渲染。 這是一個非常簡化的情況:
我應該使用另一個 swiftui 功能還是我必須對我的代碼庫進行一些徹底的更改?
import SwiftUI
@main
struct TestApp: App {
@StateObject private var env = PrinterEnv()
var body: some Scene {
WindowGroup {
ReadyDashboardView()
.environmentObject(env)
}
}
}
struct ReadyDashboardView: View {
@EnvironmentObject var env: PrinterEnv
var body: some View {
VStack {
HStack {
Spacer()
VStack {
Text(env.selectedPrinter?.isConnected ?? false ? "Printer Ready" : "Not Connected")
.padding(.bottom)
}
Spacer()
}
.background(env.selectedPrinter?.isConnected ?? false ? .green : .red)
Button("Connect") { env.selectedPrinter?.isConnected = true }
Button("Disconnect") { env.selectedPrinter?.isConnected = false }
}
}
}
class PrinterEnv: ObservableObject {
@Published var configuredPrinters: [Printer] = []
@Published var selectedPrinter: Printer?
init() {
configuredPrinters.append(contentsOf: [Printer()])
selectedPrinter = configuredPrinters.first
}
}
class Printer: ObservableObject {
@Published var isConnected = false
}
我建議你不要嵌套ObservableObject
,它不能很好地工作。
例如,嘗試使用Printer
結構,例如:
struct Printer: Identifiable {
let id = UUID()
var isConnected = false
}
我不認為這個問題與嵌套的可觀察對象特別相關。 嵌套它們運行良好,甚至被社區成員推薦為管理應用程序范圍狀態並確保性能可接受的最佳方式。
看到這個: https://www.fivestars.blog/articles/app-state/
也就是說,我相信它可能與使用@Published
屬性包裝器包裝可觀察的 object 有關。
在操場上試試這個:
import SwiftUI
class AppState: ObservableObject {
let fooState = FooState()
let barState = BarState()
}
class FooState: ObservableObject {
@Published var foo: Int = 42
}
class BarState: ObservableObject {
@Published var bar: String = Date().debugDescription
}
struct FooView: View {
@EnvironmentObject var fooState: FooState
var body: some View {
Text("foo: \(fooState.foo)")
}
}
struct BarView: View {
@EnvironmentObject var barState: BarState
var body: some View {
Text("bar: \(barState.bar)")
}
}
struct ContentView: View {
@EnvironmentObject var appState: AppState
var body: some View {
VStack {
Spacer()
FooView()
.environmentObject(appState.fooState)
Button("update foo") {
appState.fooState.foo = Int.random(in: 1...100)
}
Spacer()
BarView()
.environmentObject(appState.barState)
Button("update bar") {
appState.barState.bar = Date().debugDescription
}
Spacer()
}
}
}
import PlaygroundSupport
PlaygroundPage.current.liveView = UIHostingController(
rootView: ContentView()
.frame(width: 320, height: 414)
.environmentObject(AppState())
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.