How to force NavigationLink to recreate destination?

86 Views Asked by At

I have a menu view where I push a game view. When I dismiss game view and push it again, the pushed view is old game view. I want it to be a new view. How to do this?

struct MenuView: View {
    
    @State private var showGameView: Bool = false
    
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(
                    destination: gameView,
                    isActive: $showGameView) {
                        EmptyView()
                    }
                Button {
                    showGameView = true
                } label: {
                    Text("Play")
                }
            }
        }
        .navigationViewStyle(.stack)
    }
    
    @MainActor
    @ViewBuilder private var gameView: some View {
        let gameModel = MyGameModel.myGameModel()
        ContentView()
            .environmentObject(gameModel)
    }
}

enter image description here

1

There are 1 best solutions below

0
Sweeper On BEST ANSWER

Rather using an @EnvironmentObject, you should make the MyGameModel a @StateObject in ContentView.

struct ContentView: View {
    @StateObject var model = MyGameModel.myGameModel()
    // rather than:
    // @EnvironmentObject var model: MyGameModel

    ...
}

This causes model to be initialised with MyGameModel.myGameModel(), and the previous game model object (if any) to be deinitialised, whenever a new ContentView is (re)created.