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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:06:24