I am trying to make simple app auth.
In ContentView
I have two tabs, each tab will have their own .task{}
in which I will make an HTTP
request to obtain some data.
The problem that I am facing is when you open the app, switch tabs and tap "toggle" at the top, you will see in the console that both .task{}
and .onAppear{}
has been called event tho these views wren't visible at all. Why? And how to make API calls only when app states is logged
As a workaround I could add extra check in each .task
to check the app state but it doesn't seems right...
import SwiftUI
@main
struct myApp: App {
@StateObject private var auth: Auth = Auth()
var body: some Scene {
WindowGroup {
if auth.isLogged {
ContentView()
.environmentObject(auth)
} else {
VStack {
Button("toggle auth") {
auth.isLogged.toggle()
}
}
}
}
}
}
@MainActor
class Auth: ObservableObject {
@Published var isLogged: Bool = false
}
struct ContentView: View {
// Annimatin Properties
@State private var expanded: Bool = false
@Namespace private var animation
@EnvironmentObject var auth: Auth
var body: some View {
Button("toggle") {
self.auth.isLogged.toggle()
}
TabView {
SampleTab("Listen Now", "play.circle.fill")
SampleTab("Browse", "square.grid.2x2.fill")
}
}
@ViewBuilder
func CustomBottomSheet() -> some View {
// Animating sheet backgrund (To look like it's expanding from the Bottom)
VStack {
Text("Hello")
}
.frame(height: 70)
.overlay(alignment: .bottom, content: {
Rectangle()
.fill(.gray.opacity(0.3))
.frame(height: 1)
})
.offset(y: -49)
}
@ViewBuilder
func SampleTab(_ title: String, _ icon: String) -> some View {
// iOS Bug, it can be avoided by wrapping the view inside ScrollView
ScrollView(.vertical, showsIndicators: false, content: {
Text(title)
.padding(.top, 25)
})
.tabItem {
Image(systemName: icon)
Text(title)
}
.onAppear {
print("======= onappear \(title)")
}
.task {
// I am gonna make an HTPP request here...
print("======= task \(title)")
}
}
}