ObjectBinding 和 EnvironmentObject 有什么区别?
What is the difference between ObjectBinding and EnvironmentObject?
当我们有@Binding 属性 包装器时,@EnvironmentObject 的用途是什么?我无法弄清楚为什么需要@EnvironmentObject。我查看了这些帖子,但它并不是我想要的
EnvironmentObject in SwiftUI
我也看了他们的文档,太薄了。
https://developer.apple.com/documentation/swiftui/environmentobject
我会尽力解释一下。我们有下一个修饰符 @State
、@StateObject
、@ObservedObject
@Published
、@EnvironmentObject
和 @Binding
.
@State
- 声明本地值 属性。 Apple 建议尽量少用它们,因为 @State
属性 应该只在视图内部使用,并且负责一些小的 UI 事情。它应该有简单的值类型,而不是引用类型,否则它不会为你更新 UI。
@StateObject
- 声明并实例化 object 实例。通常应该显示您的数据模型。 object 必须确认 ObservableObject 协议。
@ObservedObject
- 声明一个 属性,它使用从 parent 视图传递过来的标记为 @StateObject
的实例。当您不希望可重用视图依赖于外部 object 时,这是一个不错的选择。这样您就可以将 @StateObject
直接传递给每个 child 视图。
@EnvironmentObject
- 也像 @ObservedObject
一样声明了 属性,但是当你将一个实例传递给所有子视图树时应该使用这个修饰符。要将实例传递给 child 视图,只需调用 YourViewToPresent().environmentObject(<your object>)
。然后这个 child 视图及其 child 将能够使用 @EnvironmentObject var instance: YourInstance
访问实例,而无需额外的努力或传递。此修饰符查找已声明的类型,因此您不能在同一环境中声明多个相同类型的 object。您还应该小心,不要过多使用它,因为这可能会在您的项目(库、框架)上打开很多架构后门。
@Published
- 应用于在视图更改时将 ObservableObject
变量标记为 re-render 视图。
@Binding
- 定义 属性 可以修改真正的真相来源 (@State, @ObservedObject, @EnvironmentObject
)。将属性之一从 1-3 点传递到视图,您必须将 child 视图中的 属性 声明为 @Binding
以创建引用。使用 $
符号将真理之源传递给 child:MessageDetails(message: $message)
。这样,通过更改 @Binding
,您将更改实际的真相来源。
更多资讯推荐观看Data Flow Through SwiftUI
奖金:
@Environment
- 用于通过使用 keyPath @Environment(\.colorScheme)
获取环境值。您可以读取此值,但无法设置此值。如果更改值,则会导致 UI re-render。 SwiftUI 可能会更新一些值。要查找所有可用的密钥,请查找 EnvironmentValues
的文档。您还可以覆盖和添加自定义 EnvironmentValue
.
当我们有@Binding 属性 包装器时,@EnvironmentObject 的用途是什么?我无法弄清楚为什么需要@EnvironmentObject。我查看了这些帖子,但它并不是我想要的
EnvironmentObject in SwiftUI
我也看了他们的文档,太薄了。 https://developer.apple.com/documentation/swiftui/environmentobject
我会尽力解释一下。我们有下一个修饰符 @State
、@StateObject
、@ObservedObject
@Published
、@EnvironmentObject
和 @Binding
.
@State
- 声明本地值 属性。 Apple 建议尽量少用它们,因为@State
属性 应该只在视图内部使用,并且负责一些小的 UI 事情。它应该有简单的值类型,而不是引用类型,否则它不会为你更新 UI。@StateObject
- 声明并实例化 object 实例。通常应该显示您的数据模型。 object 必须确认 ObservableObject 协议。@ObservedObject
- 声明一个 属性,它使用从 parent 视图传递过来的标记为@StateObject
的实例。当您不希望可重用视图依赖于外部 object 时,这是一个不错的选择。这样您就可以将@StateObject
直接传递给每个 child 视图。@EnvironmentObject
- 也像@ObservedObject
一样声明了 属性,但是当你将一个实例传递给所有子视图树时应该使用这个修饰符。要将实例传递给 child 视图,只需调用YourViewToPresent().environmentObject(<your object>)
。然后这个 child 视图及其 child 将能够使用@EnvironmentObject var instance: YourInstance
访问实例,而无需额外的努力或传递。此修饰符查找已声明的类型,因此您不能在同一环境中声明多个相同类型的 object。您还应该小心,不要过多使用它,因为这可能会在您的项目(库、框架)上打开很多架构后门。@Published
- 应用于在视图更改时将ObservableObject
变量标记为 re-render 视图。@Binding
- 定义 属性 可以修改真正的真相来源 (@State, @ObservedObject, @EnvironmentObject
)。将属性之一从 1-3 点传递到视图,您必须将 child 视图中的 属性 声明为@Binding
以创建引用。使用$
符号将真理之源传递给 child:MessageDetails(message: $message)
。这样,通过更改@Binding
,您将更改实际的真相来源。 更多资讯推荐观看Data Flow Through SwiftUI
奖金:
@Environment
- 用于通过使用 keyPath @Environment(\.colorScheme)
获取环境值。您可以读取此值,但无法设置此值。如果更改值,则会导致 UI re-render。 SwiftUI 可能会更新一些值。要查找所有可用的密钥,请查找 EnvironmentValues
的文档。您还可以覆盖和添加自定义 EnvironmentValue
.