ios – SwiftUI NavigationStack duplicate view

[ad_1]

Im making an attempt to make use of new performance of navigation in SwiftUI and now I’ve downside with related early downside in NavigationLink when vacation spot view created greater than twice. May you please assist me to search out proper resolution.


enum Step: String, Identifiable {
    case page1
    case page2
    case page3
    
    var id: String {
        self.rawValue
    }
}
class Router: ObservableObject {
    @Revealed var steps: [Step] = []
    static let shared = Router()
    non-public init(){}
    func showPage1() {
        steps.append(.page1)
    }
    
    func showPage2() {
        steps.append(.page2)
    }
    
    func showPage3() {
        steps.append(.page3)
    }
    
    func popToRoot() {
        steps.removeAll()
    }
}

class BaseStepViewModel: ObservableObject {
    let step: Step
    let router: Router
    init(step: Step, router: Router) {
        self.step = step
        self.router = router
        print("Created step (step.rawValue)")
    }
    
    func shopNextPage() {
        router.showPage2()
    }
}

class Step1ViewModel: BaseStepViewModel { }

class Step2ViewModel: BaseStepViewModel {
    override func shopNextPage() {
        router.showPage3()
    }
}

class Step3ViewModel: BaseStepViewModel {
    override func shopNextPage() {
        router.popToRoot()
    }
}


struct StepView: View {
    
    @StateObject var viewModel: BaseStepViewModel
    
    var physique: some View {
        Button {
            viewModel.shopNextPage()
        } label: {
            Textual content(viewModel.step.rawValue)
        }

    }
}

class WelcomeViewModel: ObservableObject, Identifiable {
    let title: String
    let router: Router
    var id: String {
        title
    }
    
    init(title: String, router: Router) {
        self.title = title
        self.router = router
        print("Created welcome view")
    }
    
    func startFlow() {
        router.showPage1()
    }
}

struct WelcomeView: View {
    @StateObject var viewModel: WelcomeViewModel
    
    var physique: some View {
        Button {
            viewModel.startFlow()
        } label: {
            Textual content(viewModel.title)
        }

    }
}

struct RootView: View {
    
    @StateObject var router = Router.shared
    
    var physique: some View {
        NavigationStack(path: $router.steps) {
            WelcomeView(viewModel: .init(title: "Welcome", router: router))
                    .id("Welcome")
            .navigationDestination(for: Step.self) { step in
                swap step {
                case .page1:
                    StepView(viewModel: Step1ViewModel(step: step, router: router))
                case .page2:
                    StepView(viewModel: Step2ViewModel(step: step, router: router))
                case .page3:
                    StepView(viewModel: Step3ViewModel(step: step, router: router))
                }
            }
        }
    }
}

As you possibly can see the WelcomeViewModel created a number of instances. I am tried add a particular id to make view/viewModel distinctive, however it’s did not assist.

[ad_2]

Leave a Reply