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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
可以直接使用 Publisher 作为 SwiftUI 中的 @ObjectBinding 属性吗?
结合 SwiftUI 远程获取数据 - ObjectBinding 不更新视图
合并SwiftUI远程获取数据-ObjectBinding不会更新视图
SwiftUI ObjectBinding 不会使用 combine 接收来自可绑定对象的 didchange 更新
解决运行maven 出现-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environme