SwiftUI:函数内的按钮不更新视图

SwiftUI: Button inside function doesn't update view

在我看来,我正在尝试实现一个由函数 buttonView() 返回的按钮。该按钮显示布尔值是真、假还是零。该按钮从 nil 开始,每次单击按钮时在 true 和 false 之间切换,更新视图以显示 bool 的最新值。

问题: 显示布尔值的最新值的文本在单击时不会 change/update。

有趣的是,同一个按钮 works/updates 不放在函数中而是放在视图本身时完全没问题。

以下 SwiftUI 代码显示了我正在使用的代码。 (我在 macOS Monterey 上使用 XCode 13.2.1)

struct TestView: View {
    
    var body: some View {
        buttonView()          
    }
    
    func buttonView() -> some View {
        @State var testBool: Bool?        // THE BOOL CHANGING/BEING SHOWN
        
        return Button(action: {
            testBool = Bool.random()      // SETS BOOL VALUE ON CLICK
        }, label: {
            VStack {
                Text("click me")
                Text(testBool == nil ? "nil" : String(testBool!))  //DISPLAYS BOOL VALUE
            }
        })
    }
}

@State内部定义了一个成员函数。相反,它应该在您的 View 的顶层定义——这是它 retain/update 状态的唯一方式。最小的工作变化是:

struct TestView: View {
    @State var testBool: Bool? //<-- Here
    
    var body: some View {
        buttonView()
    }
    
    func buttonView() -> some View {
        Button(action: {
            testBool = Bool.random()
        }, label: {
            VStack {
                Text("click me")
                Text(testBool == nil ? "nil" : String(testBool!)) 
            }
        })
    }
}

进一步重构使其看起来 Swift-ier 可能是:

struct TestView: View {
    @State var testBool: Bool?
    
    var body: some View {
        Button(action: {
            testBool = Bool.random()
        }) {
            VStack {
                Text("click me")
                if let testBool = testBool {
                    Text(testBool ? "true" : "false")
                } else {
                    Text("nil")
                }
            }
        }
    }
}