swagger_generator_flutter/CANCELTOKEN_USAGE_GUIDE.md

133 lines
3.0 KiB
Markdown

# 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<BaseResult<User>> getUser({
@Query('id') int? id,
});
```
**启用后 / After:**
```dart
Future<BaseResult<User>> 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<MyPage> {
final _cancelToken = CancelToken();
@override
void dispose() {
_cancelToken.cancel('页面已关闭');
super.dispose();
}
Future<void> 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<void> 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()` 会取消所有使用它的请求