You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Async/Await实现按钮点击时Alert弹窗不触发问题排查

问题分析

你的代码里,登录按钮的Task块调用try await viewModel.signIn(...)时未捕获异常,且如果AuthViewModel内部没正确处理错误、更新isErrorOccured状态,就会导致Alert无法触发。

解决方案

步骤1:修正LoginView的错误捕获逻辑

在Task中添加do-catch块,捕获登录过程中的错误并更新viewModel状态:

Button {
    Task {
        do {
            try await viewModel.signIn(withEmail: username, password: password)
        } catch {
            viewModel.customError = error
            viewModel.isErrorOccured = true
        }
    }
} label: {
    // 按钮原有内容保持不变
}

步骤2:确保AuthViewModel的状态正确定义

AuthViewModel需要包含@Published修饰的属性,才能让View感知状态变化,示例实现如下:

class AuthViewModel: ObservableObject {
    @Published var isErrorOccured = false
    @Published var customError: Error?
    
    func signIn(withEmail email: String, password: String) async throws {
        // 这里替换为实际登录逻辑(如调用后端接口、第三方Auth服务)
        // 验证失败时抛出错误
        if email != "name@gmail.com" || password != "correctpassword" {
            throw NSError(domain: "AuthError", code: 401, userInfo: [NSLocalizedDescriptionKey: "用户名或密码错误"])
        }
        // 登录成功后的逻辑(如跳转主页、存储用户信息)
    }
}

额外注意事项

  • 确认AuthViewModel已通过.environmentObject()注入到View层级中,否则@EnvironmentObject var viewModel: AuthViewModel会找不到实例。
  • 检查formValid计算属性的实现,确保只有输入合法时按钮才可用,避免无效输入触发登录。

内容的提问来源于stack exchange,提问作者user21666271

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:09:55