Flutter中如何使用Dio取消上一次请求并重新发起新请求
解决方案
Dio 原生提供了 CancelToken 组件用于主动终止正在执行的请求,你只需要在每次发起新请求前取消上一次未完成的请求即可,修改后的代码如下:
首先在当前页面/逻辑类中声明全局属性:
final client = Dio(); // 存储当前请求的取消令牌 CancelToken? _currentCancelToken;
修改请求方法,加入取消逻辑和参数传递:
Future<Voice?> getData({required bool checkStatus}) async { // 发起新请求前先取消上一次未完成的请求 if (_currentCancelToken != null && !_currentCancelToken!.isCancelled) { _currentCancelToken!.cancel('主动取消旧请求'); } // 为本次请求生成新的取消令牌 _currentCancelToken = CancelToken(); final url = '你的请求地址'; // 携带复选框状态参数,可根据需求放到query或者body中 final params = {'check_status': checkStatus}; try { final response = await client.get( url, queryParameters: params, // 绑定取消令牌到本次请求 cancelToken: _currentCancelToken, ); if (response.statusCode == 200) { return Voice.fromJson(response.data); } else { print('${response.statusCode} : ${response.data.toString()}'); throw response.statusCode!; } } catch (error) { // 区分主动取消的请求和真实请求异常 if (error is DioException && error.type == DioExceptionType.cancel) { // 主动取消的请求不需要做错误处理 return null; } // 其他异常正常打印处理 print(error); rethrow; } }
注意事项
- 直接在复选框的
onChanged回调中调用getData传入当前勾选状态即可,无论操作多快,只有最后一次请求会正常返回结果 - 页面销毁时需要调用
_currentCancelToken?.cancel('页面销毁取消请求'),避免内存泄漏
内容的提问来源于stack exchange,提问作者Majid Ali
相关产品推荐
相关产品推荐

