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

Flutter中明明将Snackbar显示条件设为false,为何Snackbar仍重复弹出?

问题根源

你代码存在两个核心错误,共同导致了该问题:

  • 第一,执行顺序完全颠倒
    你当前的逻辑是点击按钮后先判断LoginError.errorMessage(此时存的是上一次登录请求的错误结果),再发起本次的loginWithEmailPassword登录请求。第一次登录失败后错误值一直存在,第二次点击按钮时首先就读到了上次遗留的错误值,直接弹出SnackBar,之后才发起本次正确的登录请求,所以会出现先弹旧错误再成功登录的现象。
  • 第二,setState写法错误,清空逻辑从未执行
    你代码里写的setState() { ... }是Dart中普通的函数声明语法,并不是调用Flutter State类提供的setState方法。正确的调用方式是把状态更新逻辑放在回调参数里,即setState(() { ... })。这个错误导致你写的清空LoginError.errorMessage的代码从来没有被执行过,错误值一直残留在静态属性中。

修复方案

调整执行顺序,等待登录异步请求返回后再做错误判断,同时修正setState的写法:

BottomButton(
  text: "Tap to Login",
  onPressed: () async {
    // 先清空上次的错误
    setState(() {
      errorMessage = null;
      LoginError.errorMessage = null;
    });
    // 等待本次登录请求执行完成
    await loginWithEmailPassword();
    // 再判断本次请求的错误结果
    errorMessage = LoginError.errorMessage;
    if (errorMessage != null) {
      SnackBar errorSnackBar = SnackBar(
        content: Text(
          LoginError.errorMessage,
          textAlign: TextAlign.center,
        )
      );
      // Flutter 2.0+推荐替换为ScaffoldMessenger.of(context).showSnackBar(errorSnackBar)
      Scaffold.of(context).showSnackBar(errorSnackBar);
    }
  },
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:39:03