6

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?

swalkner
  • 16,679
  • 31
  • 123
  • 210

0 Answers0