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

Dart调用异步login方法时出现AuthExceptionController实例报错的原因

错误原因
  • login() 是异步方法,但你声明的返回值为void,异步方法内部抛出的异常会被封装为Future的错误信息,返回void时调用方无法获取对应的Future实例,自然无法监听处理异常。
  • 页面层调用login()方法时没有添加await关键字,同步的try-catch只能捕获同步执行上下文内抛出的异常,异步任务未等待就执行完毕的话,后续抛出的异常不会被当前try块捕获,会成为全局未处理异常。
修复方案

步骤1:修改controller层login方法的返回类型

将返回值从void改为Future<void>,让调用方可以获取到异步任务对应的Future实例:

// controller
Future<void> login(BuildContext context) async {
  isLoading.value = Status.loading;
  try {
    UserModel? user = await repository.signInWithEmailAndPassword(
          emailTextController.text, passwordTextController.text);

    if (user != null) {
      box.write("auth", user);
      QR.navigator.replaceAll('/initial');
    }
  } on AuthException catch (error) {
    throw AuthExceptionController(title: error.title, content: error.content);
  } finally {
    isLoading.value = Status.success;
  }
}

步骤2:修改页面层调用逻辑

有两种可选的异常捕获方式:

方式1:搭配async/await使用try-catch(更推荐,可读性更高)

// page
onPressed: () async {
  if (_formKey.currentState!.validate()) {
    try {
      // 添加await等待异步方法执行完成
      await _authenticationController.login(context);
    } on AuthExceptionController catch (error) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text(error.content)));
    }
  }
}

方式2:直接调用Future的catchError方法

如果不想将onPressed改为异步方法,可以直接对返回的Future注册异常回调:

// page
onPressed: () {
  if (_formKey.currentState!.validate()) {
    _authenticationController.login(context)
      .catchError((error) {
        if (error is AuthExceptionController) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text(error.content)));
        }
      });
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:27:04