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.

  1. @State - 声明本地值 属性。 Apple 建议尽量少用它们,因为 @State 属性 应该只在视图内部使用,并且负责一些小的 UI 事情。它应该有简单的值类型,而不是引用类型,否则它不会为你更新 UI。
  2. @StateObject - 声明并实例化 object 实例。通常应该显示您的数据模型。 object 必须确认 ObservableObject 协议。
  3. @ObservedObject - 声明一个 属性,它使用从 parent 视图传递过来的标记为 @StateObject 的实例。当您不希望可重用视图依赖于外部 object 时,这是一个不错的选择。这样您就可以将 @StateObject 直接传递给每个 child 视图。
  4. @EnvironmentObject - 也像 @ObservedObject 一样声明了 属性,但是当你将一个实例传递给所有子视图树时应该使用这个修饰符。要将实例传递给 child 视图,只需调用 YourViewToPresent().environmentObject(<your object>)。然后这个 child 视图及其 child 将能够使用 @EnvironmentObject var instance: YourInstance 访问实例,而无需额外的努力或传递。此修饰符查找已声明的类型,因此您不能在同一环境中声明多个相同类型的 object。您还应该小心,不要过多使用它,因为这可能会在您的项目(库、框架)上打开很多架构后门。
  5. @Published - 应用于在视图更改时将 ObservableObject 变量标记为 re-render 视图。
  6. @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.