SwiftUI中如何在一个EnvironmentObject中调用另一个EnvironmentObject?
解决SwiftUI中SessionManager无法访问UserInfo环境对象的问题
@EnvironmentObject属性包装器仅适用于SwiftUI的View类型(或遵循View协议的结构),它依赖View树的环境传递机制工作。SessionManager是普通的ObservableObject类,不在View层级中,因此无法通过@EnvironmentObject获取UserInfo实例,这就是报错的核心原因。
方案1:依赖注入(初始化时传入UserInfo)
直接在创建SessionManager时传入UserInfo实例,这是最简洁可靠的解决方式:
修改SessionManager定义
添加接收UserInfo的初始化方法:
class SessionManager: ObservableObject { let userInfo: UserInfo init(userInfo: UserInfo) { self.userInfo = userInfo // 这里可以编写依赖userInfo的初始化逻辑 } // 其他业务代码... }
更新App结构体的对象创建
在App中先创建UserInfo,再将其传入SessionManager的初始化:
@main struct MyApp: App { @StateObject var userInfo = UserInfo() @StateObject var sessionManager: SessionManager init() { FirebaseApp.configure() // 先实例化userInfo,再传入sessionManager let tempUser = UserInfo() self._userInfo = StateObject(wrappedValue: tempUser) self._sessionManager = StateObject(wrappedValue: SessionManager(userInfo: tempUser)) } var body: some Scene { WindowGroup { ContentView() .environmentObject(userInfo) .environmentObject(sessionManager) } } }
方案2:监听UserInfo的属性变化
如果SessionManager需要响应UserInfo中@Published属性的更新,可以将userInfo声明为@ObservedObject,并通过Combine监听变化:
import Combine class SessionManager: ObservableObject { @ObservedObject var userInfo: UserInfo private var cancellables = Set<AnyCancellable>() init(userInfo: UserInfo) { self.userInfo = userInfo // 监听UserInfo的某个Published属性变化 userInfo.$somePublishedProperty .sink { [weak self] newValue in // 处理属性更新逻辑 self?.handleUserInfoChange(newValue) } .store(in: &cancellables) } private func handleUserInfoChange(_ newValue: SomeType) { // 具体业务处理 } // 其他业务代码... }
内容的提问来源于stack exchange,提问作者tinyabacus
相关产品推荐
相关产品推荐

