I am trying to call a function that updates some values in the main view (DashboardView) of my app when switching to it from the SignInView after logging in. The function is inside an onAppear
method that is called within the DashboardView.
Now, all this works fine when I don't have any SignInView. The app launches, onAppear
is called and the values populate the view. However if I introduce the if statement that handles the switch between SignInView and DashboardView, I have to refresh the DashboardView by going to the SettingsView and back to the Dashboard, and only then the values are populated. What I don't understand is that the function within the onAppear method is called correctly, after logging in, but I need to refresh the view to actually show the data. This is my code:
struct ContentView: View {
@ObservedObject var settingsViewModel: SettingsViewModel
@ObservedObject var sessionManager: SessionManager
var body: some View {
GeometryReader {
geometry in
if sessionManager.session != nil && sessionManager.userAuthorization == .authorized {
ViewRouter(
settingsViewModel: settingsViewModel,
sessionManager: sessionManager,
size: geometry.size
)
} else {
SignInView(sessionManager: sessionManager)
}
}.edgesIgnoringSafeArea(.vertical)
.onAppear{
getUser()
}
}
}
extension ContentView {
func getUser() {
sessionManager.listen()
}
}
struct ViewRouter: View {
@ObservedObject var settingsViewModel: SettingsViewModel
@ObservedObject var sessionManager: SessionManager
var size: CGSize
var body: some View {
VStack{
HeaderView(headerHeight: size.height * 0.07)
TabView{
DashboardView(
viewModel: DashboardView.DashboardViewModel(
settingsViewModel: settingsViewModel,
sessionManager: sessionManager
),
width: size.width,
dashboardViewHeight: size.height * 0.8
)
.tabItem() {
Image(systemName: "house.fill")
Text("Dashboard")
}
SettingsView(
viewModel: settingsViewModel,
sessionManager: sessionManager,
width: size.width,
settingsViewHeight: size.height * 0.8
)
.tabItem() {
Image(systemName: "gearshape.2.fill")
Text("Settings")
}
}.accentColor(.white)
}
}
}
struct DashboardView: View {
@ObservedObject var viewModel: DashboardViewModel
var width: CGFloat
var dashboardViewHeight: CGFloat
var body: some View {
VStack(alignment: .center) {
SubViews()
SubViews()
SubViews()
}
.onAppear {
viewModel.updateData()
}
}
}