SwiftUI LoginView在登录后不会消失

I am using an AppStateView() to check for a user being logged in or not:

struct AppStateView: View {

    @EnvironmentObject var appState: AppState

    var body: some View {
        if (self.appState.user != nil) {
            return AnyView(ContentView().environmentObject(appState))
        } else {
            return AnyView(LoginView().environmentObject(appState))
        }
    }
}

Inside the LoginView():

struct LoginView: View {

    @EnvironmentObject var appState: AppState

    @State private var username: String = ""
    @State private var password: String = ""

    var body: some View {
        NavigationView {
            VStack {
                TextField("Username", text: $username)
                SecureField("Password", text: $password)
                Button(action: {
                    self.appState.login(username: self.username, password: self.password) { user in
                        if user.accountId != 0 {
                            print("logged in")
                        } else {
                            print("not logged in")
                        }
                    }

                }) {
                    Text("LOGIN")
                }
                NavigationLink(destination: RegisterView()) {
                    Text("Sign Up")
                }
            }
        }
    }
}

有一个按钮调用appState.login函数:

struct User: Codable {
    let uid: Int
    let name: String
    let accountname: String
    let accountId: Int
    let startBalance: Double
}

class AppState: ObservableObject {

    @Published var user: User? = nil

    let apiURL: String = "http://localhost/api.php?"

    init() {
        if let user = UserDefaults.standard.object(forKey: "user") as? Data {
            if let loadedUser = try? JSONDecoder().decode(User.self, from: user) {
                self.user = loadedUser
            }
        }
    }

    func login(username: String, password: String, completion: @escaping (User) -> ()) {

        let urlstring = "\(apiURL)get_users&username=\(username)&password=\(password)"

        guard let url = URL(string: urlstring) else { return }

        URLSession.shared.dataTask(with: url) { (data, _, error) in

            guard let data = data, error == nil else {
                debugPrint("Fehler beim Laden von \(url)", String(describing: error))
                return
            }

            let user = try! JSONDecoder().decode(User.self, from: data)
            if let encoded = try? JSONEncoder().encode(user) {
                UserDefaults.standard.set(encoded, forKey: "user")
            }

            DispatchQueue.main.async {
                completion(user)
            }
        }.resume()

    }

    func logout() {
        self.user = nil
        UserDefaults.standard.removeObject(forKey: "user")
    }

}

From my understanding of observable objects, I think, after pressing the login button, the user gets updated, thus the LoginView() view gets reloaded with a user logged in. But it must switch to the AppStateView(). It feels a little bit weird to add a second check inside the LoginView() to show the LoginView() or the AppStateView() because I am already doing it in the "parent view" AppStateView().