You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Router导航时,如何获取Hashable路径中设置的参数

解决Form视图获取路径枚举中id参数的方案

方案一:通过NavigationDestination直接传递参数(推荐)

这是最符合SwiftUI导航设计的优雅方案,无需修改Router,直接在路由匹配时将枚举中的参数传递给目标视图:

  1. 修改主视图的导航配置,使用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)
                }
            }
        }
    }
}
  1. 修改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的路径数组中获取当前视图对应的参数:

  1. 给Paths枚举添加参数提取扩展:
extension Paths {
    // 提取Form case的id参数
    var formId: String? {
        guard case .Form(let id) = self else { return nil }
        return id
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:40:17