@Environment与@EnvironmentObject

时间:2019-09-23 11:54:41

标签: swiftui

SwiftUI中的@Environment和@EnvironmentObject有什么区别?

从我从文档中发现的内容来看,@ Environment似乎用于ColorScheme之类的全局依赖项。但是我找不到它们之间的确切区别。例如,它们可以互换使用吗?

5 个答案:

答案 0 :(得分:5)

这是我为自己准备的笔记。可能有用,

@EnvironmentObject:

  • 类似于@ObservedObject
  • 模型应符合ObservableObject协议
  • 我们需要将此模型中的属性标记为@Published,以通知更改以查看使用该对象的情况
  • 确定模型对象应为类
  • 不需要默认值,因为它可以从环境中读取默认值。如果对象在环境中不可用,应用程序将崩溃
  • 另一个主要区别是,假设我们有5个视图(V1…V5),如果要将对象直接从V1传递到V5,可以使用@EnvironmentObject而不是@ObservedObject。设置要在V1中传递的数据,并在V5(或任何需要的位置)中检索它。代码将非常简单。
  • 它将在同一时间环境中仅容纳一种类型的实例。
  • 它完全基于视图。如果父视图设置了环境对象,则其所有子项都可以使用它。如果另一个父视图设置了另一个env对象,那么他们的孩子可以使用它。例如:如果您在SceneDelegate的ContentView中设置环境对象,则其所有子视图都可以使用它。

@环境:

  • 我们可以使用它来获取与系统相关的值,例如应用程序是在亮还是暗模式下运行,核心数据的托管对象上下文,大小类等...
  • 我们需要提供适当的键来访问其值,因为它针对多个键拥有相同的数据类型。

谢谢

答案 1 :(得分:3)

通过

@Enviroment,您可以访问属性值,例如用户设置(例如配色方案,布局方向等)或视图属性,例如EditMode或PresentationMode。 @EnviromentObject由您定义,可用于所有视图,对其的更改将驱动您视图的更新。

答案 2 :(得分:3)

我想在其他人的回答中添加一些东西。

@Environmentvalue 类型,而 @EnvironmentObjectreference 类型。

您只能在 @EnvironmentObject 中使用单个对象实例。如果您添加另一个对象实例,它将替换之前的实例。

但是作为 @Environment 键值对,只需确保键不同即可。

您只需要使用 @EnvironmentObject var object: Object 使对象从环境中检索实例,并通过 .environmentObject(Object()) 注入实例

另一方面,有许多预定义的 @Environment 系统管理环境值。您也可以创建自定义的。它需要是 struct 类型并符合 EnvironmentKey

这是一个例子,

struct SunlightKey: EnvironmentKey {
    static var defaultValue: Double = 1.09
}

然后将它添加到 EnvironmentValues 作为它的扩展。

这是一个基本示例

extension EnvironmentValues {
    
    var sunlight: Double {
        get { self[SunlightKey.self] }
        set { self[SunlightKey.self] = newValue }
    }
    
}

然后,在视图文件中使用它,例如 @Environment(\.sunlight) var sunlight 并通过 .environment(\.sunlight, 4.05)

注入

希望,这有帮助

答案 3 :(得分:1)

System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure. @Environment都是属性包装器,而@EnvironmentObject保留带有预定义键的值,@Environment不仅保留预定义键,还保留任意值。例如,如果您需要保留有关用户对象的信息,包括名称,年龄,性别等,则需要使用@EnvironmentObject,而如果要保留设备是处于暗还是亮模式,则使用系统本地语言,日历首选项和编辑模式,非常适合使用@EnvironmentObject

@Environment

答案 4 :(得分:1)

@Environment是一个键/值对,而@EnvironmentObject只是一个由其类型标识的值。两者都是变量存储属性包装器。