无法从Class中访问EnvironmentObject的技术问题求助
SwiftUI中ObservableObject访问EnvironmentObject的解决办法
为啥报错?
@EnvironmentObject 是SwiftUI专门给View结构体设计的属性包装器,普通的ObservableObject类根本用不了它。你直接在ExampleClass里加这个,系统找不到对应的实例,自然就报那个致命错误了。
怎么解决?
核心思路就是把AppStateModel通过初始化参数传给ExampleClass,具体分两步:
1. 修改ExampleClass的初始化方法
给ExampleClass加个接收AppStateModel的初始化参数,把它存成类的属性,之后就能直接用了:
class ExampleClass: ObservableObject { @Published var items: [...] = [] let appState: AppStateModel // 保存AppStateModel实例 init(appState: AppStateModel) { self.appState = appState // 这里就能访问appState.someString了 print(appState.someString) } }
2. 在视图层传递实例
因为@EnvironmentObject只能在View里拿到,所以得在能访问它的地方创建ExampleClass并传参。推荐在父视图里处理:
// 父视图示例 struct ParentView: View { @EnvironmentObject var model: AppStateModel var body: some View { // 创建ExampleClass时把model传进去,再传给ExampleView ExampleView(exampleClass: ExampleClass(appState: model)) } }
然后修改ExampleView,不用再自己处理EnvironmentObject,直接用传入的ExampleClass:
struct ExampleView: View { @ObservedObject var exampleClass: ExampleClass var body: some View { SomeOtherView(items: exampleClass.items) } }
如果不想用父视图传递,也可以在ExampleView里用lazy初始化(确保model已经被环境注入):
struct ExampleView: View { @EnvironmentObject var model: AppStateModel lazy var exampleClass: ExampleClass = ExampleClass(appState: model) var body: some View { SomeOtherView(items: exampleClass.items) } }
额外提示
如果项目结构复杂,也可以用依赖注入框架(比如Swinject)来统一管理这些实例,但简单场景下,直接通过初始化传参就足够用了。
内容的提问来源于stack exchange,提问作者user21138718
相关产品推荐
相关产品推荐

