NavigationSplitView中NavigationStack+NavigationPath编译失败求助
解决「Cannot find '$router' in scope」编译错误
错误原因
你使用@Observable修饰的Router类作为环境对象,但在NavigationStack中尝试用$router.path获取绑定是错误的——$语法仅适用于SwiftUI内置的属性包装器(如@State、@Binding),对于通过@Environment(Router.self)获取的Observable类实例,需要通过Bindable类型来创建属性绑定。
解决方案
修改ThingListView中detail区块的NavigationStack初始化代码,将$router.path替换为Bindable(router).path:
detail: { NavigationStack(path: Bindable(router).path) { VStack { if let selectedThing = selectedThing { ThingDetailView(selectedThing: selectedThing) } else { PlaceholderView() } } .navigationDestination(for: Thing.self) { thing in ThingEditView(thing: thing) } }//nav }
额外检查点
- 环境注入正确性:你的
App结构体中,.environment(router)修饰在WindowGroup的父级Scene上,这是正确的,确保了整个窗口内的视图都能获取到Router实例。 - Observable类的使用:在其他视图(如
ThingDetailView)中,直接修改router.path或调用router.navigateToRoot()即可触发导航更新,无需额外绑定语法——@Observable会自动跟踪属性变化并刷新视图。
内容的提问来源于stack exchange,提问作者JohnSF
相关产品推荐
相关产品推荐

