为什么我的子 SwiftUI 视图没有更新?

xyy*_*yyx 4 swift swiftui

我有一个 Swift ui 视图,其中有一个儿童女巫从 @State 变量获取值。当我更新 @State 变量时,视图会重建,但子视图保持不变。

struct ContentView: View {  
  @State var msg: String = ""  
  var body: some View {  
    VStack {  
      Button(action: {  
        self.msg = "Hallo World"  
      }, label: { Text("Say Hallo")})  

      ChildView(msg: msg).padding().background(Color.orange)  
      Text(msg).padding().background(Color.green)  
    }.frame(maxWidth: .infinity, maxHeight: .infinity)  
  }  
}  

struct ChildView: View {  
  @State var msg: String  

  var body: some View {  
    Text(msg)  
  }  
}  
Run Code Online (Sandbox Code Playgroud)

use*_*734 6

import SwiftUI

struct ContentView: View {
  @State var msg: String = ""
  var body: some View {
    VStack {
      Button(action: {
        self.msg += "Hallo World "
      }, label: { Text("Say Hallo")})

      ChildView(msg: msg).padding().background(Color.orange)
      Text(msg).padding().background(Color.green)
    }.frame(maxWidth: .infinity, maxHeight: .infinity)
  }
}

struct ChildView: View {
  var msg: String

  var body: some View {
    Text(msg)
  }
}
Run Code Online (Sandbox Code Playgroud)

您的 ChildView 中不需要任何状态属性包装器。一旦消息发生变化,SwiftUI 就会知道,每个依赖于其值的视图都应该“重新加载”。

在您的示例中,您通过将初始值包装到其状态属性包装器来“修复”它。SwiftUI 不会重新加载它,因为 @State 属性包装器意味着该值存储在 ChildView 之外。@State 属性包装器不属于视图状态。相反,一旦 @State 包装的属性发生变化,SwiftUI 将重新评估 View 的 body 计算属性。要“重置”@State属性包装值,您需要“重新创建”它,这意味着状态属性也将重置为其初始值。

在此输入图像描述