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

Flutter中http.client请求超时异常捕获与SnackBar提示方案

解决HTTP请求超时异常捕获与SnackBar展示问题

步骤1:完善异常捕获与错误提示逻辑

给POST请求添加超时限制,通过分类型捕获异常(包括超时、网络连接失败等),并封装SnackBar展示方法:

Future<dynamic> postRequest(BuildContext context) async {
  try {
    var response = await client.post(
      Uri.parse(Url),
      headers: headers,
      body: body,
    ).timeout(const Duration(seconds: 10)); // 自定义超时时长,例如10秒

    // 此处添加正常响应的处理逻辑(如解析响应体)
    return json.decode(response.body);
  } on TimeoutException catch (_) {
    // 捕获超时异常
    _showErrorSnackBar(context, "请求超时,请稍后重试");
  } on SocketException catch (_) {
    // 捕获网络连接异常
    _showErrorSnackBar(context, "网络连接失败,请检查网络状态");
  } catch (e) {
    // 捕获其他未知异常
    _showErrorSnackBar(context, "请求出错:${e.toString()}");
  }
}

// 封装SnackBar展示方法
void _showErrorSnackBar(BuildContext context, String message) {
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      content: Text(message),
      backgroundColor: Colors.redAccent,
      duration: const Duration(seconds: 3),
    ),
  );
}

步骤2:调用注意事项

  • 调用该方法时,确保传入的BuildContext有效(避免使用已销毁Widget的context),可在StatefulWidget的State类中调用,或通过GlobalKey获取Scaffold上下文。
  • 若client为全局http.Client,记得在不再使用时调用client.close()释放资源。

关键说明

  • 通过.timeout()显式设置超时时间,可主动触发TimeoutException,精准捕获超时场景。
  • 分类型捕获异常能给用户更友好的针对性提示,避免展示晦涩的底层错误信息。
  • ScaffoldMessenger是Flutter 2.0+推荐的SnackBar实现方式,替代旧版Scaffold.of(context)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:20:31