SwiftUI - 在 ObservableObject 类/依赖注入中使用 EnvironmentObject
Posted
技术标签:
【中文标题】SwiftUI - 在 ObservableObject 类/依赖注入中使用 EnvironmentObject【英文标题】:SwiftUI - Use EnvironmentObject in ObservableObject Class/Dependency Injection 【发布时间】:2021-07-25 22:06:46 【问题描述】:我在@ObservableObject 类中使用@EnvironmentObject 时遇到问题。根据一些研究,这是不可能的,因为 EnvironmentObject 仅用于视图。
我已经采取了以下措施,但该值并未动态更新。
例如,它是用“A”的值初始化的,但是当我在使用 EnvironmentObject 的类中更改值时,在我的 ObservableObject 类中找到的值仍然是“A”。它在所有其他使用 @EnvironmentObject 的位置更新,而不是 ObservableObject API 类。
当 EnvironmentObject 更新发布的变量时,有没有办法让 ObservableObject API 类中的代码更新?
需要一个变量在其中像 EnvironmentObject 一样操作的类是 API 类。
class SelectedStation: ObservableObject
@Published var selectedStation: String = "A"
class API: ObservableObject
var selectedStation: SelectedStation
init(selectedStation: SelectedStation)
self.selectedStation = selectedStation
print(selectedStation.selectedStation)
///some code that will utilize the selectedStation variable
我到底做错了什么?
【问题讨论】:
【参考方案1】:您正在初始化一个不同版本的类。尝试像这样添加public static let shared = SelectedStation()
:
class SelectedStation: ObservableObject
@Published var selectedStation: String = "A"
public static let shared = SelectedStation()
然后在需要用到的地方,声明为:
var selectedStation = SelectedStation.shared
此外,您应该将 @Published 变量重命名为 selectedStation 以外的名称,否则您可能会遇到不幸的 selectedStation.selectedStation
作为对该变量的引用。
最后,请记住 @Environment
需要使用 SelectedStation.shared
进行初始化,因此所有内容都共享一个类的实例化。
【讨论】:
这完美无瑕。谢谢!我同意,我需要在这里更改命名,因为 selectedStation.selectedStation 远非理想。最后,这种设计模式有名字吗? 它本质上是但不完全是单例模式。真正的 Singleton 只能有一个实例化,这在此处不正确,但只要您使用.shared
,它实际上就是一个 Singleton。当您需要在非视图中使用它时,它对于您的单一事实来源非常有用。
知道了。现在有什么理由将它存储在 ObservableObject 类中?由于这只是一个公共变量,我似乎可以将 public static let shared = SelectedStation() 放在我想要的任何地方。或者这是一个不正确的假设?
如果不是@Published
,当它改变时你不会更新你的视图。这只存在于ObservableObject
类中。以上是关于SwiftUI - 在 ObservableObject 类/依赖注入中使用 EnvironmentObject的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI - 如何在 SwiftUI 中弹出到特定视图?
SwiftUI - SwiftUI 中是不是有等效的 popViewController?