首页 > 解决方案 > 为什么我的孩子 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)  
  }  
}  

标签: swiftswiftui

解决方案


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)
  }
}

您的 ChildView 中不需要任何状态属性包装器。一旦 msg 发生变化,SwiftUI 就知道,每个 View 都应该根据其值“重新加载”。

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

在此处输入图像描述


推荐阅读