SwiftUI中NavigationStack手动返回动画异常问题
在使用SwiftUI的NavigationStack时,通过修改path数组手动返回(比如调用router.path.removeLast()),从SubView1回到RootView的过程中会出现白屏(预期应显示SubView1的黄色背景直到动画结束),但使用导航栏自带的返回按钮则显示正常。
问题原因
直接修改path数组时,SwiftUI可能会提前销毁SubView1的视图实例,导致转场动画过程中没有内容填充,从而出现白屏。而系统返回按钮是通过NavigationStack内部的导航控制逻辑处理,会保持视图存在直到动画完成。
解决方案
方案一:用环境dismiss动作替代直接修改path
通过注入SwiftUI的环境dismiss动作,和系统返回按钮的行为保持一致,彻底避免动画异常:
struct SubView1: View { @Environment(\.dismiss) private var dismiss var body: some View { ZStack { Color.yellow.ignoresSafeArea() VStack { Text("SubView1") Button { dismiss() } label: { Text("back to RootView") } } } } }
方案二:给SubView1的Router添加@Bindable绑定
如果必须通过修改path实现返回,需要给SubView1中的Router添加@Bindable,确保SwiftUI能正确追踪状态变化,在动画过程中维持视图存在:
struct SubView1: View { @Bindable var router: Router var body: some View { ZStack { Color.yellow.ignoresSafeArea() VStack { Text("SubView1") Button { router.path.removeLast() } label: { Text("back to RootView") } } } } }
(注:原代码中SubView1的Text内容写错为"RootView",已修正为"SubView1")
内容的提问来源于stack exchange,提问作者Amirca
相关产品推荐
相关产品推荐

