Flutter Dio网络请求超时处理方案
在Flutter项目中使用Dio进行网络请求时,遇到超时情况该如何有效处理?目前设置的connectTimeout和receiveTimeout似乎不生效,请求卡住后既没有抛出TimeoutException,也没有自动重试机制。想请教:
- 如何正确配置Dio的超时参数?是否需要结合Options使用?
- 超时后如何自动触发重试逻辑?是否有推荐的重试策略?
- 在请求超时的情况下,除了try-catch DioError,还有哪些异常处理的最佳实践?
- 是否有办法区分不同类型的超时(如连接超时、响应超时)并进行差异处理?
项目中需要稳定的网络请求模块,希望能得到完整的超时处理解决方案。
更多关于Flutter Dio网络请求超时处理方案的实战教程也可以访问 https://www.itying.com/category-92-b0.html
3 回复
在使用 Flutter 的 Dio 库进行网络请求时,超时是一个常见的问题。为了解决这个问题,可以采取以下措施:
首先,在创建 Dio 实例时设置超时时间。例如,设置连接超时时间为 5 秒,响应超时时间为 10 秒:
final dio = Dio(BaseOptions(
connectTimeout: 5000, // 连接超时
receiveTimeout: 10000, // 响应超时
));
其次,当发生超时时,Dio 会抛出 DioError
异常,类型为 DioErrorType.connectTimeout
或 DioErrorType.receiveTimeout
。可以在请求中捕获异常并进行处理:
try {
final response = await dio.get('https://example.com/api');
print(response.data);
} on DioError catch (e) {
if (e.type == DioErrorType.connectTimeout) {
print('连接超时');
} else if (e.type == DioErrorType.receiveTimeout) {
print('响应超时');
} else {
print('其他错误: ${e.message}');
}
}
此外,还可以通过拦截器来统一处理超时逻辑:
dio.interceptors.add(InterceptorsWrapper(onError: (DioError e, handler) {
if (e.type == DioErrorType.connectTimeout || e.type == DioErrorType.receiveTimeout) {
return handler.reject(e); // 超时直接返回错误
}
return handler.next(e);
}));
这样可以避免在每个请求中重复写超时处理代码。
更多关于Flutter Dio网络请求超时处理方案的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中使用Dio处理网络请求超时的方案如下:
- 全局设置超时时间(推荐方式):
Dio dio = Dio();
dio.options = BaseOptions(
connectTimeout: Duration(seconds: 5), // 连接超时5秒
receiveTimeout: Duration(seconds: 10), // 接收数据超时10秒
sendTimeout: Duration(seconds: 5), // 发送数据超时5秒
);
- 单个请求设置超时:
try {
Response response = await dio.get(
'https://example.com/api',
options: Options(
sendTimeout: Duration(seconds: 3),
receiveTimeout: Duration(seconds: 3),
),
);
} on DioError catch (e) {
if (e.type == DioErrorType.connectionTimeout) {
print("连接超时");
} else if (e.type == DioErrorType.receiveTimeout) {
print("接收超时");
} else if (e.type == DioErrorType.sendTimeout) {
print("发送超时");
}
}
- 重试机制(使用dio_retryable):
dio.interceptors.add(
RetryInterceptor(
dio: dio,
retries: 3, // 重试次数
retryDelays: [
Duration(seconds: 1),
Duration(seconds: 2),
Duration(seconds: 3),
],
),
);
注意事项:
- 超时时间应根据实际网络情况合理设置
- 建议对不同API设置不同的超时时间
- 要正确处理超时异常,给用户友好提示
超时常见错误类型:
- connectionTimeout: 连接服务器超时
- receiveTimeout: 接收响应超时
- sendTimeout: 发送请求超时