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

Flutter中如何根据接口返回结果调用SnackBar?

问题分析与修复方案

你的代码报错核心原因是在按钮点击回调里错误使用了FutureBuilder——FutureBuilder是Widget组件,只能放在Widget树中用来构建UI,不能直接在onPressed这种无Widget返回要求的回调里调用。另外你也没处理接口返回失败的场景,下面是完整修复方案:

1. 修正按钮点击逻辑

直接用async/await调用接口,根据返回结果显示对应SnackBar,不需要FutureBuilder:

onPressed: () async {
  // 调用添加购物车接口并等待结果
  final String result = await ApiServices.addToCart(productId);
  
  // 根据接口返回值构建对应的SnackBar
  final SnackBar snackBar = SnackBar(
    behavior: SnackBarBehavior.floating,
    backgroundColor: result == "done" ? Colors.green.shade700 : Colors.red.shade700,
    content: Row(
      children: [
        Icon(
          result == "done" ? Icons.shopping_bag_outlined : Icons.error_outline,
          color: Colors.white,
        ),
        const SizedBox(width: 10),
        Text(
          result == "done" ? "商品已成功加入购物车!" : "添加购物车失败,请稍后重试",
          style: const TextStyle(color: Colors.white),
        ),
      ],
    ),
  );
  
  // 显示SnackBar
  ScaffoldMessenger.of(context).showSnackBar(snackBar);
},

2. 优化接口函数(增加异常捕获)

原接口函数没有处理网络异常、请求失败等情况,一旦出现问题会导致未捕获错误,建议加上异常捕获:

static addToCart(int productId) async {
  try {
    SharedPreferences prefss = await SharedPreferences.getInstance();
    var token = prefss.getString('token');
    var response = await http.post(
      Uri.parse("$baseURL/adc"),
      body: {
        "product_id": productId.toString(),
      },
      headers: {
        'Authorization': 'Bearer $token',
      },
    );
    
    // 根据状态码判断结果
    return response.statusCode == 200 ? "done" : "failed";
  } catch (e) {
    // 捕获网络异常、解析错误等所有异常,统一返回失败标识
    return "failed";
  }
}

为什么原来的代码不行?

  • onPressed是VoidCallback类型,不需要返回任何Widget,而你直接在里面创建了FutureBuilder(Widget),这不符合回调的要求,会触发语法/运行时错误。
  • 原代码只处理了snapshot.hasData的情况,但没有判断返回的是"done"还是"failed",也没处理请求过程中的加载状态和异常状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:04:07