SwiftUI 中的@Environment 和@EnvironmentObject 有什么区别?
从我从文档中发现的内容来看,@Environment 似乎旨在用于像 ColorScheme 这样的全局依赖项。但我找不到它们之间的任何确切区别。例如,它们可以互换使用吗?
Kar*_*raj 13
这是我为自己准备的笔记。可能有用,
@环境对象
@ObservedObject
@Published
以通知更改以查看哪些主动使用该对象@EnvironmentObject
而不是@ObservedObject
。设置要在 V1 中传递的数据并在 V5(或任何需要的地方)中检索它。代码会简单很多。@环境
谢谢!?
@Enviroment 使您可以访问属性值,例如用户设置(例如配色方案、布局方向等)或视图的属性,例如 EditMode 或 PresentationMode。@EnviromentObject 由您定义,可用于所有视图,对其进行的更改会驱动您的视图更新。
它们@Environment
都是@EnvironmentObject
属性包装器,同时@Environment
保留带有预定义键的值,@EnvironmentObject
不仅保留预定义键,还保留任意值。例如,如果您需要保留有关用户对象的信息,其中包括姓名、年龄、性别等,您需要使用@EnvironmentObject
,而如果您想保留设备是处于深色模式还是浅色模式、系统本地语言、日历首选项,请编辑模式非常适合使用@Environment
。
@Environment(\.locale) var locale: Locale
@EnvironmentObject var user: User // is an object where you keep user-related information
Run Code Online (Sandbox Code Playgroud)
我想在其他人的答案中添加一些内容。
@Environment
是值类型但是@EnvironmentObject
是引用类型。
您只能在 中使用单个对象实例@EnvironmentObject
。如果添加另一个对象实例,它将替换前一个实例。
但是,作为@Environment
键值对,只需确保键不同即可。
您只需要使用@EnvironmentObject var object: Object
使对象从环境中检索实例,并通过以下方式注入实例.environmentObject(Object())
另一方面,有许多预定义的@Environment
系统管理环境值。您也可以创建自定义的。它需要是struct
类型并符合EnvironmentKey
.
这是一个例子,
struct SunlightKey: EnvironmentKey {
static var defaultValue: Double = 1.09
}
Run Code Online (Sandbox Code Playgroud)
然后将其添加到 中EnvironmentValues
作为它的扩展。
这是一个基本的例子
extension EnvironmentValues {
var sunlight: Double {
get { self[SunlightKey.self] }
set { self[SunlightKey.self] = newValue }
}
}
Run Code Online (Sandbox Code Playgroud)
然后,@Environment(\.sunlight) var sunlight
在视图文件中使用它并通过以下方式注入值.environment(\.sunlight, 4.05)
希望这可以帮助