swiftUI笔记3|@EnvironmentObject和@ObservedObject
使用场景:观察者模式。定义了某种时刻更新的数据模型,某些视图中需要持续观察该数据并作出相应变化,就像社交软件粉丝数量的增长。
本篇包含:
Observable协议
@Published属性包装器
@ObservedObject属性包装器
@EnvironmentObject属性包装器
@StateObject属性包装器
@State属性包装器
@Binding属性包装器
1 定义一个时刻更新的数据模型——发布者
这里用一个struct描述某种数据的属性,再用一个class存放这种数据的数组及其他属性。该class需要遵循ObservableObject协议,这使得其下被@Published包装的属性一旦更新就会发布通知。
Don't specify a default or initial value for the observed object
那么谁来接收通知呢?
2 订阅者
在某个视图中,使用@ObservedObject包装的属性就是订阅者,例如
视图中需要data数据的地方都会根据数据源更新而变化。
如果是在自视图中,也可以使用@EnvironmentObject包装该属性
那么在创建某个子视图时,不是用childView(data: 数据源, ...)传入数据,而是childView().
environmentObject(数据源)。
3 @StateObject属性包装器
它也是订阅者,但是与 @ObservedObject
不同,@StateObject
的对象会一直存在于整个视图的生命周期中,不会因为视图的重新渲染而被销毁和重建。这使得 @StateObject
适用于那些需要持久状态且与视图密切相关的数据对象,比如页面导航、用户输入等。
4 @State和@Binding
@EnvironmentObject适用于全局共享数据,而@ObservedObject适用于单个视图与特定数据对象的关联。它们在不同的场景下可以一起使用。
以上是跨视图的一组包装器,还有一组用于从外部修改某一个特定视图内数据的包装器@State和@Binding。
@State
:用于在一个视图内部创建一个可以被视图修改的局部状态。它常用于存储一些视图自身的状态,当 @State
的值发生变化时,视图会自动重新渲染。
@Binding
:用于将外部的数据绑定到视图中,使得视图能够修改外部数据。它通常用于在父视图中将数据传递给子视图,并让子视图能够修改父视图中的数据。
@State
和 @Binding
主要用于视图内部的状态管理和与外部数据的双向绑定,适用于处理局部的、特定于视图的数据。
@Published
和 @ObservedObject
主要用于创建可观察对象和将可观察对象关联到视图,适用于处理全局状态、跨视图的数据共享和自动刷新。