Flutter Toast在API返回错误时不显示,成功时正常显示问题排查
问题排查与修复方案
1. 检查状态字段的类型匹配
不少后端会把status返回成字符串(比如"true"/"false")而非布尔值,这会让state.loginModel.status == false的判断不生效,进不了错误提示分支。
- 修复方式:要么改成字符串匹配,要么确保Model里的status被解析为布尔值:
// 若后端返回字符串,修改判断逻辑 else if (state.loginModel.status == "false") { // ... Toast代码 } // 或者检查Model的序列化逻辑,保证status是bool类型
2. 确认Fluttertoast初始化
如果没在main()里初始化Fluttertoast,部分场景下可能无法弹出:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Fluttertoast.initialize(); // 添加初始化代码 runApp(MyApp()); }
3. 验证上下文有效性
BlocConsumer的listener上下文可能失效,可替换为Scaffold的SnackBar测试是否能正常显示:
// 替换Toast为SnackBar测试 ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(state.loginModel.message), backgroundColor: Colors.red, ) );
4. 给message加非空判断
虽你提到print能输出message,但保险起见添加非空处理,避免空值导致Toast不显示:
else if (state.loginModel.status == false) { final message = state.loginModel.message ?? "登录失败"; print(message); Fluttertoast.showToast( msg: message, // ... 其余参数不变 ); }
5. 简化状态判断逻辑
把else if改为else,避免因status为null等情况漏判:
if (state is ShopLoginSuccessState) { final loginModel = state.loginModel; if (loginModel.status == true) { // 成功提示代码 } else { // 处理status为false或null的情况 print(loginModel.message); Fluttertoast.showToast( msg: loginModel.message ?? "登录失败", backgroundColor: Colors.red, // ... 其余参数不变 ); } }
原始代码片段
Widget build(BuildContext context) { var emailController = TextEditingController(); var passwordController = TextEditingController(); // ignore: non_constant_identifier_names var FormKey = GlobalKey<FormState>(); return BlocConsumer<ShopLoginCubit, ShopLoginStates>( listener: (context, state) { if (state is ShopLoginSuccessState) { if (state.loginModel.status == true) { print(state.loginModel.message); print(state.loginModel.data.token); Fluttertoast.showToast( msg: state.loginModel.message, toastLength: Toast.LENGTH_LONG, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 5, backgroundColor: Colors.green, textColor: Colors.white, fontSize: 16.0); } else if (state.loginModel.status == false) { print(state.loginModel.message); Fluttertoast.showToast( msg: state.loginModel.message, toastLength: Toast.LENGTH_LONG, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 5, backgroundColor: Colors.red, textColor: Colors.white, fontSize: 16.0, ); } } }, // 此处省略build方法的其余代码 ); }
内容的提问来源于stack exchange,提问作者Zeyad Mohamed
相关产品推荐
相关产品推荐

