SwiftUI:属性包装器@State使用示例
2024-09-13 本文已影响0人
喔牛慢慢爬
@State 用于在视图内部管理局部状态。当状态值发生变化时,视图会自动重新渲染。通常用于在一个视图中持有简单的、短期的状态。它特别适合存储值类型数据,如字符串、整数、枚举或结构体实例。
- @State 用于管理视图的私有状态。
- @State主要用于存储值类型数据(与视图的生命周期一致)。
作用:@State 用于在视图中声明可变的状态属性,并自动更新视图。当使用 @State 标记属性时,在 SwiftUI 内部会被自动转换为一对 setter 和 getter,对这个属性进行赋值的操作将会触发 View 的刷新,它的 body 会被再次调用,底层渲染引擎会找出界面上被改变的部分,根据新的属性值计算出新的 View,并进行刷新。
应用场景
- 当需要因视图内的数据变化而触发视图更新时。
- 它常用于简单的 UI 组件状态管理,如开关状态、文本输入等。
- 如果数据不需要复杂的跨视图共享,使用 @State 可以简化状态管理。
注意事项
- 尽量仅在视图的内部使用 @State,即使未显式标记为 private,也应当将其视为视图的私有属性。
- @State 为包装数据同时提供了双向数据绑定管道,可以通过 $ 前缀来访问。
- @State 不适合用于存储大量数据或复杂数据模型,这种情况下更适合使用 @StateObject 或其他状态管理方案。
- 在构造方法中赋值时,需通过 _ 下划线访问 @State 的原始值并进行赋值。
@State var name: String
init(text: String) {
// 给下划线版本赋值,需要用 State 类型本身进行包装
_name = State(wrappedValue: text)
}
- @State 变量在视图的构造函数中只能赋值一次,后续的调整需要在视图的 body 内进行。
- 如果不需要在当前视图或在子视图中(通过 @Binding )修改值,无需使用 @State。
- @State 是线程的安全,可以在非主线程中进行修改。
示例
在下面的示例中,我们使用 @State 来声明一个可变的计数属性,点击按钮时,计数会增加并更新视图
struct MyView: View {
@State private var count: Int = 0
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
count += 1
}
}
}
}