EnvironmentObject vs Singleton in SwiftUI?



如果整个视图在应用程序中访问同一个模型,我认为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)
}
}

提前谢谢。

您是正确的,在这种情况下没有理由使用EnvironmentObject。苹果甚至鼓励不要过度使用EnvironmentObjects。

尽管如此,如果你在许多视图中使用一个对象,EnvironmentObject也可能很棒,因为这样你就不必把它从视图A传递到视图B,从视图B传递到视图C,等等

通常,您会发现自己处于这样一种情况:即使是@State和@Binding也足以共享和更新视图中以及两个视图之间的数据。

我认为,当您的应用程序通过场景支持多个窗口时(例如基于文档的应用程序(,可能单例不是解决方案,而EnvironmentObject更好。要共享selectedColor的示例。当您使用singleton时,selectedColor在整个应用程序中、在每个场景中(在窗口中的每个视图中(都是相同的。但是,如果要使用分隔设置,则EnvironmentObject非常方便。

我发现singleton更容易,因为你可以在类中使用它,而不是通过.onAppear((.在类中传递它

辛格尔顿:

class ViewModel {
private let appSetting = AppSetting.shared
}

环境对象:

class SomeClass {
private var appSetting : AppSetting?

func addAppSetting(_ appSetting : AppSetting) {
self.appSetting = appSetting
}
}

struct MyView: View {
@EnvironmentObject var appSetting : AppSetting
@StateObject var someClass = SomeClass()
var body: some View {
ZStack {
}
.onAppear {
someClass.addAppSetting(appSetting)
}
}  
}

最新更新