SwiftUI中 published 、observableObject、stateObject、EnvironmentObject的玩法

SwiftUI中 published 、observableObject、stateObject、EnvironmentObject的玩法

记录一下SwiftUI中 published 、observableObject、stateObject、EnvironmentObject的玩法

@published

在 SwiftUI 中,@Published 是一个属性包装器(property wrapper),它通常与 ObservableObject 类一起使用,以便在属性发生变化时发出通知。这样,任何依赖于这些属性的 SwiftUI 视图都会自动更新。
@Published 属性包装器使得 ObservableObject 的属性可以作为一个 Publisher,允许其他对象订阅这个属性的变化。这是响应式编程的一个关键部分,特别是在 SwiftUI 中,它使得视图可以响应其状态的变化。

import SwiftUI  
import Combine  
  
class ViewModel: ObservableObject {  
    @Published var count: Int = 0  
      
    func increment() {  
        self.count += 1  
    }  
}  
  
struct ContentView: View {  
    @ObservedObject var viewModel = ViewModel()  
      
    var body: some View {  
        VStack {  
            Text("Count: \(viewModel.count)")  
                .padding()  
            Button("Increment") {  
                self.viewModel.increment()  
            }  
        }  
        .padding()  
    }  
}

什么时候用observableObject什么时候用stateObject

在 SwiftUI 中,@ObservedObject 和 @StateObject 都是用于管理对象生命周期和响应对象状态变化的属性包装器,但它们的使用场景和生命周期管理策略有所不同。
@ObservedObject
@ObservedObject 用于观察一个已经存在的对象,通常是你的视图模型(ViewModel)或其他 ObservableObject。这个对象通常是在视图之外创建的,并作为属性传递给视图。@ObservedObject 不会自动创建或销毁它观察的对象;它只是观察对象的状态变化,并在状态变化时触发视图的重新渲染。
使用 @ObservedObject 的一个常见场景是,当你有一个跨多个视图共享的状态或业务逻辑时。在这种情况下,你可能会在视图控制器或应用的其他部分创建和管理这个对象,然后将它传递给需要观察其变化的视图。
@StateObject
@StateObject 用于创建和管理一个 ObservableObject 的生命周期。当你使用 @StateObject 时,SwiftUI 会自动为你创建和销毁这个对象。这个对象通常只在当前视图的生命周期内存在。与 @ObservedObject 不同,@StateObject 通常用于封装仅在当前视图内使用的状态和业务逻辑。
使用 @StateObject 的一个常见场景是,当你有一个与特定视图紧密相关的状态或业务逻辑时。例如,一个表示用户输入的表单视图可能会使用 @StateObject 来管理表单的状态和验证逻辑。
总结
使用 @ObservedObject 当你的对象是在视图之外创建和管理的,并且你需要在多个视图之间共享这个对象的状态或业务逻辑。
使用 @StateObject 当你的对象仅在当前视图内使用,并且你希望 SwiftUI 自动管理这个对象的生命周期。
在选择使用哪个属性包装器时,关键是理解你的视图和对象之间的关系,以及你希望如何管理这些对象的生命周期。

什么时候使用EnvironmentObject

在 SwiftUI 中,@EnvironmentObject 是一个强大的属性包装器,它允许你在整个视图层级中传递和共享一个遵循 ObservableObject 协议的对象,而不需要通过视图之间的层层传递。通过 @EnvironmentObject,你可以轻松地将数据从一个视图传递到另一个视图,优化应用程序的数据管理。
当一个对象的属性使用 @Published 标注时,任何依赖于该对象的视图都会在属性值发生变化时收到通知并重新渲染。这意味着,只要对象在视图层次结构的某个顶级位置被设置到环境中,任何子视图都可以通过 @EnvironmentObject 访问到该对象,并对其中 @Published 属性的变化做出响应。
@EnvironmentObject 的使用场景通常涉及需要在多个视图层级间共享的状态或数据。例如,在一个包含多个子视图的复杂界面中,你可能希望共享一个包含用户认证状态、应用设置或其他跨视图数据的对象。通过使用 @EnvironmentObject,你可以将这个对象注入到应用程序的环境中,使得它可以在整个应用程序范围内被访问和共享。
需要注意的是,环境对象的存在期一般比单个视图更长,因此它们通常用于存储那些在整个应用程序或视图层级中都需要访问的数据。相比之下,@StateObject 通常用于封装仅在当前视图内使用的状态和业务逻辑,其生命周期由 SwiftUI 自动管理。
总结来说,@EnvironmentObject 在 SwiftUI 中是一个非常有用的工具,它简化了数据在视图层级间的传递和共享,从而提高了代码的可读性和可维护性。

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值