SwiftUI项目设置ViewModel为EnvironmentObject后报错如何解决
问题排查与解决方案
你遇到的No ObservableObject of type MarketplaceViewModel found错误,按运行场景分别排查即可解决:
1. 预览场景报错
这是最高发的原因:SwiftUI预览视图独立于App主视图树,不会自动继承你在App入口注入的全局EnvironmentObject,需要手动给预览视图注入依赖。
给MarketplaceView的预览代码补充注入逻辑即可:
struct MarketplaceView_Previews: PreviewProvider { static var previews: some View { MarketplaceView() .environmentObject(MarketplaceViewModel(listingRepository: ListingRepository())) } }
如果ContentView的预览也触发同类型错误,同理给预览的ContentView也注入对应的MarketplaceViewModel和AuthSession即可。
2. 真机/模拟器运行时报错
你贴出的代码注入层级逻辑是正确的:App入口用@StateObject初始化ViewModel→给根视图ContentView注入→子视图MarketplaceView接收,排查两个异常点:
- 确认你项目的App入口只有一个
WindowGroup,如果有多个WindowGroup,每个WindowGroup的根视图都需要单独注入MarketplaceViewModel - 清理Xcode构建缓存后重新运行:按下
Cmd+Shift+K清空旧构建产物,避免旧代码缓存导致注入失效
额外优化建议
你当前MarketplaceView里直接取下标[1]访问数组元素,Firebase快照监听返回数据前listingRowViewModels是空数组,会触发数组越界崩溃,建议加空值判断:
struct MarketplaceView: View { @EnvironmentObject var marketplaceViewModel: MarketplaceViewModel var body: some View { // 优先判断数组非空再取值 if marketplaceViewModel.listingRowViewModels.count > 1, let title = marketplaceViewModel.listingRowViewModels[1].listing.title { Text(title) } else { ProgressView("商品加载中") } } }
内容的提问来源于stack exchange,提问作者jonthornham
相关产品推荐
相关产品推荐

