ObjectBinding 和 EnvironmentObject 有啥区别?

Posted

技术标签:

【中文标题】ObjectBinding 和 EnvironmentObject 有啥区别?【英文标题】:What is the difference between ObjectBinding and EnvironmentObject?ObjectBinding 和 EnvironmentObject 有什么区别? 【发布时间】:2019-06-08 23:21:22 【问题描述】:

当我们有 @Binding 属性包装器时,@EnvironmentObject 的目的是什么?我无法弄清楚为什么需要@EnvironmentObject。我看了这些帖子,但它不是我要找的 EnvironmentObject in SwiftUI How to use BindableObjects (EnviromentObject)?

我还查看了他们的文档,这些文档太薄了。 https://developer.apple.com/documentation/swiftui/environmentobject

【问题讨论】:

Data Flow Through SwiftUI talk from WWDC 2019 正好涵盖了这一点。 EnvironmentObject 在 26:45 被提及,但我建议观看整个谈话。 【参考方案1】:

我会尽量解释一下。我们有@State@ObservedObject@EnvironmentObject@Binding

    @State - 声明本地值属性。 Apple 建议尽可能少地使用它们,因为@State 属性应该只在视图内部使用并且负责一些小的 UI 事情。 @ObservedObject - 外部参考属性。实际上应该显示的是您的数据模型。 @EnvironmentObject - 与@ObservedObject 相同,但它跨环境使用到其他视图,而@ObservedObject 应显式传递 @Binding - 定义属性不是真理源,只是对真实真理源的引用 (@State, @ObservedObject, @EnvironmentObject)。将 1-3 点的属性之一传递给视图视图必须将子视图中的属性声明为 @Binding 以创建引用并使用 $ 符号传递属性,如 MessageDetails(message: $message) 更多信息推荐观看Data Flow Through SwiftUI

统一更新: 决定从本次会议中添加一些重要信息。您可以在视图中使用@ObservedObject@Binding,但在这种情况下,您需要将所有视图中的可绑定对象传递给必要的视图。 @EnvironmentObject@Environment 允许您将可绑定对象传递给视图层次结构中的特定视图,而无需将对象传递给每个视图。目前我还没有找到苹果的真实例子,所以检查他们的会话

【讨论】:

另外:state 通常是私有的。就像一个内部视图状态,例如shouldShowView。对于ObservedObject,请考虑状态,但它的值来自对象外部,也许视图也可以更新模型的值,即它是两种方式。对于EnvironmentObject,将其视为shared 变量,它非常接近Singletons。最终将Binding 视为一种传递。不确定这是否是一个很好的例子,但弱引用永远不会保留内存,同样Binding 不是导致更改的原因,它只会传递它们

以上是关于ObjectBinding 和 EnvironmentObject 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:动画更改依赖于@ObjectBinding

可以直接使用 Publisher 作为 SwiftUI 中的 @ObjectBinding 属性吗?

结合 SwiftUI 远程获取数据 - ObjectBinding 不更新视图

合并SwiftUI远程获取数据-ObjectBinding不会更新视图

SwiftUI ObjectBinding 不会使用 combine 接收来自可绑定对象的 didchange 更新

解决运行maven 出现-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environme