使用Router导航时,如何获取Hashable路径中设置的参数
解决Form视图获取路径枚举中id参数的方案
方案一:通过NavigationDestination直接传递参数(推荐)
这是最符合SwiftUI导航设计的优雅方案,无需修改Router,直接在路由匹配时将枚举中的参数传递给目标视图:
- 修改主视图的导航配置,使用
navigationDestination匹配路径枚举,并初始化FormView时传入id:
struct MainView: View { @EnvironmentObject var router: Router<Paths> var body: some View { NavigationStack(path: $router.paths) { Button { router.push(.Form(id: "foo")) } label: { Text("跳转到表单") } // 匹配路径枚举,传递参数给对应视图 .navigationDestination(for: Paths.self) { path in switch path { case .Form(let id): FormView(id: id) } } } } }
- 修改FormView直接接收id参数:
struct FormView: View { let id: String // 直接获取传递的id @EnvironmentObject var router: Router<Paths> // 若需路由操作可保留 var body: some View { VStack { Text("获取到的ID:\(id)") } } }
这种方式完全遵循你将参数绑定到路径枚举的设计,Router保持简洁,参数传递逻辑清晰。
方案二:从Router路径数组中解析参数
如果不想依赖navigationDestination的匹配逻辑,可以给路径枚举添加参数提取的扩展,再从Router的路径数组中获取当前视图对应的参数:
- 给Paths枚举添加参数提取扩展:
extension Paths { // 提取Form case的id参数 var formId: String? { guard case .Form(let id) = self else { return nil } return id } }
- 在FormView中解析当前路径的id:
struct FormView: View { @EnvironmentObject var router: Router<Paths> // 从路径数组的最后一个元素(当前视图对应的路径)提取id private var currentId: String? { router.paths.last?.formId } var body: some View { VStack { if let id = currentId { Text("获取到的ID:\(id)") } else { Text("未找到ID参数") } } } }
注意:该方案依赖路径数组的顺序(假设当前视图对应最后一个路径元素),如果导航逻辑复杂可能出现匹配错误,因此优先推荐方案一。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

