为什么自定义SwiftUI视图无法响应外部传入的状态变化?
问题原因
不更新问题的核心是对@State属性包装器的使用场景有误:
@State是SwiftUI专为视图私有内部状态设计的包装器,它的存储不受父视图传入的初始化参数影响,只会在视图第一次创建时读取初始化参数作为初始值,后续父视图传入新的参数时,@State包裹的属性不会同步更新。- 你当前代码中
HeaderText的text、color都是从父视图接收的输入参数,不属于HeaderText的私有状态,所以用@State修饰后就切断了和父视图数据源的同步,自然不会响应父视图的状态变化。
符合原生Text逻辑的最优方案
原生Text的实现逻辑就是直接接收外部传入的不可变参数,不需要额外的状态包装器,你只需要去掉HeaderText中多余的@State修饰即可:
struct HeaderText: View { // 直接用普通不可变存储属性接收外部参数,不需要任何属性包装器 let text: String let color: Color var body: some View { Text(text) .font(.custom("Gilroy-SemiBold", size: 20)) .foregroundColor(color) } }
修改后父视图的@State属性更新时,会自动生成新的HeaderText实例传入最新的text、color参数,视图会自动刷新,完全和原生Text的行为一致,不需要用到@Binding。
补充说明
- 只有当子视图需要主动修改父视图传入的参数时,才需要用
@Binding修饰属性,当前场景下HeaderText只需要读取参数渲染,不需要修改参数,用普通let属性是最符合SwiftUI设计规范的实现。 - 如果你的实际场景中
HeaderText内部会修改text或color,再考虑用@Binding,否则用普通属性即可。
内容的提问来源于stack exchange,提问作者gavinmccabe
相关产品推荐
相关产品推荐

