SwiftUI中嵌套navigationDestination触发无限循环问题排查
我查阅了大量SwiftUI无限循环相关的问题和解答,我的问题和已知情况有所区别。目前已定位到问题触发条件:在NavigationStack嵌套结构中,若下层navigationDestination的目标闭包引用了与for参数指定类型不同的Identifiable对象,会导致上层navigationDestination的目标闭包陷入无限循环。
我花了数小时精简代码得到以下最小复现示例,再进一步简化的话循环会消失,暂时还没完全理清底层原因。比如单层NavigationStack场景下,即使不指定for类型,目标闭包也能正常工作。
struct F3: Identifiable, Hashable { let id: String = UUID().uuidString let t: String } struct R3: Identifiable, Hashable { let id: String = UUID().uuidString let t:String } struct N3: Identifiable, Hashable { let id:String = UUID().uuidString let t: String } struct LV3: View { // 在App的WindowGroup中加载此View let f2z = [ F3(t: "A"), F3(t: "B"),] var body: some View { NavigationStack { List(f2z) { f in NavigationLink(f.t, value: f) } .navigationDestination(for: F3.self) { f in VV3() // 此处触发无限循环 } .navigationTitle("L") } } } struct VV3: View { let r = R3(t: "rrr") let nz: [N3] = [ N3(t: "hhh"), N3(t: "ttt"), ] var body: some View { List(nz) { NavigationLink($0.t, value: $0) } .navigationDestination(for: N3.self) { n in Text(r.t) // 改为字符串字面量或`n.t`可修复无限循环 } .navigationTitle("V") } }
- 关键修复点:在
VV3的navigationDestination闭包中,将Text(r.t)替换为字符串字面量(如Text("fix"))或使用当前导航目标对应的n.t,无限循环即可消失。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

