簡體   English   中英

為什么 SwiftUI 不在這里更新視圖?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM