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

