I created a simple showcase where my problem can be reproduced; what I'm doing is navigating from the initial view => View1 => View2.
The navigation from the initial to View1 happens via button tap, nothing special here.
My View1 looks the following:
struct View1: View {
@ObservedObject private var viewModel = ViewModel()
private let includeDelay = true
var body: some View {
NavigationLink(
destination: View2(),
isActive: $viewModel.foo,
label: {
Text("View 1")
})
.onAppear(perform: {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(includeDelay ? 500 : 0)) {
viewModel.doSomething()
}
})
}
}
class ViewModel: ObservableObject {
@Published var foo = false
func doSomething() {
foo = true
}
}
If I include the delay in onAppear
, it works as expected; after the delay, I get navigated to View2
and stay there.
But if I remove the delay (or set it to e.g. 300ms) I get navigated to View2
, but immediately get navigated back. I don't understand what's happening here; why is my $viewModel.foo
set to false after my setting to true
?
question from:
https://stackoverflow.com/questions/65914281/programmatic-navigation-with-navigationview-navigationlink-delay-jumps-back 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…