如果整个视图在应用程序中访问同一模型,则我认为Singleton模式就足够了。我说的对吗?
例如,如果MainView和ChildView访问相同的模型(例如AppSetting),如下所示,我找不到使用EnvironmentObject而不是Singleton模式的任何理由。 如果我这样使用是否有问题?如果可以,那么什么时候应该使用EnvironmentObject而不是Singleton模式?
class AppSetting: ObservableObject {
static let shared = AppSetting()
private init() {}
@Published var userName: String = "StackOverflow"
}
struct MainView: View {
@ObservedObject private var appSetting = AppSetting.shared
var body: some View {
Text(appSetting.userName)
}
}
struct ChildView: View {
@ObservedObject private var appSetting = AppSetting.shared
var body: some View {
Text(appSetting.userName)
}
}
谢谢。
答案 0 :(得分:11)
您是正确的,在这种情况下没有理由使用EnvironmentObject。苹果甚至鼓励不要过度使用EnvironmentObjects。
尽管如此,如果您在多个视图中使用对象,那么EnvironmentObject也可能很棒,因为这样您就不必将其从视图A传递到B,从视图B传递到C等等。
通常您会发现自己处于这样一种情况,即使@State和@Binding也足以在一个视图中以及两个视图之间共享和更新数据。
答案 1 :(得分:0)
我认为当您的应用程序通过场景(示例基于文档的应用程序)支持多个窗口时,单例可能不是解决方案,而 EnvironmentObject 更好。 您要共享 selectedColor 的示例。当您使用单例时, selectedColor 在整个应用程序中,在每个场景中(在窗口中的每个视图中)都是相同的。但是如果你想使用单独的设置,EnvironmentObject 很方便。