使用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
相关产品推荐
相关产品推荐

