# CancelToken 使用指南 / CancelToken Usage Guide ## 概述 / Overview CancelToken 是 Dio 提供的请求取消机制。启用此功能后,生成的 API 方法将自动包含可选的 `CancelToken?` 参数,允许您在请求进行中取消它。 CancelToken is a request cancellation mechanism provided by Dio. When enabled, generated API methods will automatically include an optional `CancelToken?` parameter, allowing you to cancel requests while they are in progress. --- ## 配置 / Configuration 在 `generator_config.yaml` 中启用: ```yaml generation: api: cancel_token_support: true # 启用 CancelToken 支持 ``` --- ## 生成效果 / Generated Code **启用前 / Before:** ```dart Future> getUser({ @Query('id') int? id, }); ``` **启用后 / After:** ```dart Future> getUser({ @Query('id') int? id, @CancelRequest() CancelToken? cancelToken, }); ``` --- ## 使用示例 / Usage Examples ### 基本用法 / Basic Usage ```dart final cancelToken = CancelToken(); // 发起请求 / Make request final future = api.getUser(id: 1, cancelToken: cancelToken); // 取消请求 / Cancel the request cancelToken.cancel('用户取消操作'); try { final result = await future; } on DioException catch (e) { if (CancelToken.isCancel(e)) { print('请求已取消: ${e.message}'); } } ``` ### 页面离开时取消 / Cancel on Page Dispose ```dart class MyPageState extends State { final _cancelToken = CancelToken(); @override void dispose() { _cancelToken.cancel('页面已关闭'); super.dispose(); } Future loadData() async { try { final result = await api.getData(cancelToken: _cancelToken); // 处理结果 } on DioException catch (e) { if (!CancelToken.isCancel(e)) { // 处理真正的错误 } } } } ``` ### GetX Controller 使用 / With GetX Controller ```dart class MyController extends GetxController { final _cancelToken = CancelToken(); @override void onClose() { _cancelToken.cancel('Controller 已关闭'); super.onClose(); } Future fetchData() async { try { final result = await api.getData(cancelToken: _cancelToken); // 更新状态 } on DioException catch (e) { if (!CancelToken.isCancel(e)) { // 显示错误 } } } } ``` --- ## 最佳实践 / Best Practices 1. **每个请求使用独立 Token** - 如果需要单独取消某个请求 2. **页面级别共享 Token** - 页面离开时取消所有进行中的请求 3. **检查取消状态** - 使用 `CancelToken.isCancel(e)` 区分取消和真正的错误 4. **及时取消** - 避免不必要的网络请求和资源浪费 --- ## 注意事项 / Notes - CancelToken 来自 `package:dio/dio.dart`,无需额外导入 - `@CancelRequest()` 注解来自 `package:retrofit/retrofit.dart` - 取消已完成的请求不会有任何效果 - 一个 CancelToken 可以用于多个请求,调用 `cancel()` 会取消所有使用它的请求