如何在 SwiftUI 中启动应用程序时有条件地加载视图?

How to conditionally load view upon app launch in SwiftUI?

我目前正在尝试使用 UserDefaults 为我的应用程序实现自动登录功能。在加载任何视图之前我想做的是获取 UserDefaults 电子邮件和密码并从我的 API 调用登录功能。如果成功,转到主页视图,否则转到登录视图。抱歉,我是 Swift 的新手,而且我的项目时间很紧。这是我的代码段。我不确定在哪里可以添加我的逻辑:

import SwiftUI

@main
struct MyApp: App {
    init() {
        let email = UserDefaults.standard.string(forKey: "email");
        let pw = UserDefaults.standard.string(forKey: "pw");
        
        let api = MyAppAPI()
        api.signInUser(email: email, password: pw) { result in
            //JSON response contains an 'isError' field
            let isError = result.value(forKey: "error") as! Bool
            
            if !isError {
                //successful login - what to do from here?   
            }
        }
    }
    
    var body: some Scene {
        WindowGroup {
            LoginView()
        }
    }
}

这里有一个简单的方法,你可以这样做onAppear


import SwiftUI

struct ContentView: View {
    
    let email: String
    let pass: String

    init() {
        self.email = UserDefaults.standard.string(forKey: "email") ?? ""
        self.pass = UserDefaults.standard.string(forKey: "pw") ?? ""
    }
    
    @State private var result: Bool?

    var body: some View {
        
        Group {
            
            if let unwrappedResult: Bool = result {
                
                if unwrappedResult {
                    
                    Text("Home View, Welcome!")
                }
                else {
                    
                    Text("Wrong User or Pass, try again!")
                }
                
            }
            else {
                
                Text("loading...")
                
            }
  
        }
        .onAppear() { loginFunction(email: email, pass: pass) { value in result = value } }

    }
}

func loginFunction(email: String, pass: String, completion: @escaping (Bool) -> Void) {

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.milliseconds(3000)) { completion(Bool.random()) }
  
}