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 回复
        
      
      
         
        
       
             
             
            


