Swift中如何将多个StateObject传入EnvironmentObject
SwiftUI 传递多个 ObservableObject 到环境中的问题解决
问题场景
开发购物车App时,已实现通过environmentObject传递AuthViewModel来切换登录/首页视图,功能正常。现在需要新增Order可观察对象在多视图间共享,尝试用.environmentObject(viewModel, order)传递多个实例时出现报错,需要正确的实现方式以保证Order实例不会被销毁或重建。
错误代码示例
主视图代码:
import SwiftUI import Firebase @main struct DemoEcommerceApp: App { @StateObject var viewModel = AuthViewModel() @StateObject var order = Order() init() { FirebaseApp.configure() } var body: some Scene { WindowGroup { ContentViewOne() .environmentObject(viewModel, order) // 此处报错 } } }
ContentView代码:
import SwiftUI struct ContentViewOne: View { @EnvironmentObject var viewModel: AuthViewModel var body: some View { Group { if viewModel.userSession != nil { MainView() } else { LoginView() } } } } struct ContentViewOne_Previews: PreviewProvider { static var previews: some View { ContentViewOne() } }
解决方案
environmentObject方法一次只能传入一个ObservableObject实例,要传递多个需要链式调用多次该方法。修改主视图的代码如下:
import SwiftUI import Firebase @main struct DemoEcommerceApp: App { @StateObject var viewModel = AuthViewModel() @StateObject var order = Order() init() { FirebaseApp.configure() } var body: some Scene { WindowGroup { ContentViewOne() .environmentObject(viewModel) .environmentObject(order) // 链式调用传递第二个实例 } } }
后续使用
在需要使用Order实例的子视图(比如MainView)中,添加@EnvironmentObject属性来获取:
struct MainView: View { @EnvironmentObject var order: Order var body: some View { // 在这里使用order实例 Text("购物车商品数: \(order.items.count)") } }
说明
通过@StateObject声明的实例会在App的生命周期内保持唯一,不会被随意销毁或重建。链式调用environmentObject可以将多个ObservableObject注入到环境中,所有子视图都能通过@EnvironmentObject获取对应的实例,实现状态共享。
内容的提问来源于stack exchange,提问作者user21666271
相关产品推荐
相关产品推荐

