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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:36:02