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

