Flutter任务取消管理插件cancelation_token的使用
Flutter任务取消管理插件cancelation_token的使用
cancelation_token
cancelation_token
包提供了取消令牌的接口以及各种实现,可以帮助开发者更好地管理和取消异步任务。以下是该包提供的几种主要类型的取消令牌:
- CancelableToken:可以通过编程方式取消的任务。
- CompositeToken:当任何一个或所有令牌被取消时,它也会被取消。
- TimeoutToken:在超时后自动取消。
示例
超时取消长时间运行的任务
下面是一个示例,展示了如何在超时后取消一个长时间运行的任务。
示例代码
import 'package:cancelation_token/cancelation_token.dart';
void main() async {
final timeout = Duration(seconds: 5);
final errorOnTimeout = CanceledException.withStackTrace('Too long!');
final token = TimeoutToken(timeout, errorOnTimeout);
token.ensureStarted();
try {
await longProcess(token);
} on CanceledException catch (ex, st) {
print(ex.message);
print(ex.stackTrace);
print(st);
}
}
Future<void> longProcess(CancelationToken token) async {
// 模拟一个非常长的任务
while (true) {
token.throwIfCanceled();
await Future.delayed(const Duration(milliseconds: 100));
}
}
完整示例项目结构
为了更全面地展示cancelation_token
的使用,以下是一个完整的示例项目结构,包括三种不同类型的取消令牌的使用示例。
main.dart
import 'cancelable_example.dart' as cancelable;
import 'composite_example.dart' as composite;
import 'timeout_example.dart' as timeout;
void main() async {
print('CANCELABLE EXAMPLE');
await cancelable.main();
print('');
print('TIMEOUT EXAMPLE');
await timeout.main();
print('');
print('COMPOSITE EXAMPLE');
await composite.main();
}
cancelable_example.dart
import 'package:cancelation_token/cancelation_token.dart';
Future<void> main() async {
final token = CancelableToken();
// 启动一个长时间任务
Future<void> longTask() async {
for (int i = 0; i < 10; i++) {
token.throwIfCanceled();
print('Step $i');
await Future.delayed(Duration(seconds: 1));
}
}
// 启动任务
final task = longTask();
// 模拟用户取消操作
await Future.delayed(Duration(seconds: 3));
token.cancel();
try {
await task;
} on CanceledException catch (ex) {
print('Task was canceled: ${ex.message}');
}
}
composite_example.dart
import 'package:cancelation_token/cancelation_token.dart';
Future<void> main() async {
final token1 = CancelableToken();
final token2 = CancelableToken();
final compositeToken = CompositeToken([token1, token2]);
// 启动一个长时间任务
Future<void> longTask() async {
for (int i = 0; i < 10; i++) {
compositeToken.throwIfCanceled();
print('Step $i');
await Future.delayed(Duration(seconds: 1));
}
}
// 启动任务
final task = longTask();
// 模拟用户取消操作
await Future.delayed(Duration(seconds: 3));
token1.cancel(); // 取消其中一个令牌会取消整个复合令牌
try {
await task;
} on CanceledException catch (ex) {
print('Task was canceled: ${ex.message}');
}
}
timeout_example.dart
import 'package:cancelation_token/cancelation_token.dart';
Future<void> main() async {
final timeout = Duration(seconds: 5);
final errorOnTimeout = CanceledException.withStackTrace('Too long!');
final token = TimeoutToken(timeout, errorOnTimeout);
token.ensureStarted();
// 启动一个长时间任务
Future<void> longTask() async {
for (int i = 0; i < 10; i++) {
token.throwIfCanceled();
print('Step $i');
await Future.delayed(Duration(seconds: 1));
}
}
try {
await longTask();
} on CanceledException catch (ex) {
print('Task was canceled: ${ex.message}');
}
}
通过这些示例,您可以了解如何在Flutter应用中使用cancelation_token
来管理异步任务的取消。希望这些示例对您有所帮助!
更多关于Flutter任务取消管理插件cancelation_token的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复