gpt4 book ai didi

ios - ObjectBinding 和 EnvironmentObject 有什么区别?

转载 作者:搜寻专家 更新时间:2023-10-31 21:49:50 29 4
gpt4 key购买 nike

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

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

最佳答案

我将尝试进行一般性解释。我们有下一个修饰符 @State , @StateObject , @ObservedObject @Published , @EnvironmentObject , 和 @Binding .

  1. @State - 声明局部值属性。 Apple 建议尽可能少地使用它们,因为 @State属性应该只在 View 内部使用,并负责小的 UI 事情。它应该有一个简单的值类型,而不是引用类型,否则,它不会为您更新 UI。
  2. @StateObject - 声明并实例化对象实例。通常,应该显示的是您的数据模型。该对象必须符合 ObservableObject 协议(protocol)。
  3. @ObservedObject - 声明一个使用标记为 @StateObject 的实例的属性已从父 View 传递。当您不希望可重用 View 依赖于外部对象时,这是一个不错的选择。这样你就通过了 @StateObject直接到每个 subview 。
  4. @EnvironmentObject - 还将属性声明为 @ObservedObject确实如此,但是当您将实例传递给所有 subview 树时,应该使用此修饰符。要将实例传递给 subview ,只需调用 YourViewToPresent().environmentObject(<your object>) .然后这个 subview 及其 subview 可以使用 @EnvironmentObject var instance: YourInstance 访问一个实例无需额外的努力或传球。此修饰符查找已声明类型的实例,因此您不能在同一环境中声明多个相同类型的对象。您还应该小心,不要过度使用它,因为这可能会在您的项目(库、框架)上打开很多架构后门。
  5. @Published - 应该用来标记ObservableObject更改 View 时重新呈现 View 的变量。
  6. @Binding - 定义该属性可以修改真正的真相来源(@State, @ObservedObject, @EnvironmentObject)。当您将其中一个属性从 1-3 点传递到 View 时,您必须在 subview 中将该属性声明为 @Binding创建一个引用。使用 $将真理之源传递给 child 的标志:MessageDetails(message: $message) .通过更改 @Binding您将改变实际的真理之源。更多资讯推荐观看Data Flow Through SwiftUI

奖励: @Environment - 用于通过使用 keyPath @Environment(\.colorScheme) 获取环境值.您可以读取此值,但无法设置此值。如果更改值,则会导致 UI 重新呈现。 SwiftUI 可能会更新一些值。要查找所有可用 key ,请查找 EnvironmentValues 的文档.您还可以覆盖和添加自定义 EnvironmentValue .

关于ios - ObjectBinding 和 EnvironmentObject 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56510818/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com