0

I'm building a view router that switch views based on "currentPage" stored in the model.

struct RouterView: View {

@EnvironmentObject var routerViewModel: RouterViewModel

var body: some View {
    if routerViewModel.currentPage == .login {
        LoginView()
            .transition(.scale)
    }
    else if routerViewModel.currentPage == .companySelect {
        CompanySelectView()
            .transition(.scale)
    }
    ...
    ModalViewWillBeHere() <-------
}

I have modal views prepared for different situations in child views. I need to display them conditionally in the place marked in the code above. What I'm trying to do is define @ViewBuilder? var in the RouterView, which I will be able to override in the child view (for example LoginView) do display required.

I'm coming from UIKit and OOP world, so maybe I'm missing something or the logic is not following MVVM.

filip.karas
  • 596
  • 2
  • 11
  • 27

1 Answers1

1

Is this what you want?

struct RouterView: View {
    
    @EnvironmentObject var routerViewModel: RouterViewModel
    
    var body: some View {
        if routerViewModel.currentPage == .login {
            LoginView()
                .transition(.scale)
        }
        else if routerViewModel.currentPage == .companySelect {
            CompanySelectView()
                .transition(.scale)
        }
        
        ModalViewWillBeHere()
    }
    
    @ViewBuilder
    private func ModalViewWillBeHere() -> some View {
        if ... {
            YourView1()
        } else if ... {
            YourView2()
        } else {
            EmptyView()
        }
    }
}
monglong
  • 455
  • 3
  • 11
  • Almost, I want this behaviour, but I need the @ViewBuilder be located in the child views - LoginView() or CompanySelectView() – filip.karas Nov 02 '22 at 09:04