Flutter任务取消管理插件freemework_cancellation的使用

在Flutter开发中,任务取消管理是一个非常重要的功能。freemework_cancellation是一个专门用于任务取消管理的插件,它可以帮助开发者轻松地控制异步任务的生命周期。本文将详细介绍如何使用该插件。

安装

首先,在 pubspec.yaml 文件中添加依赖:

dependencies:
  freemework_cancellation: ^最新版本号

然后运行以下命令以安装依赖:

flutter pub get

使用方法

导入插件

在需要使用该插件的 Dart 文件中导入:

import 'package:freemework_cancellation/freemework_cancellation.dart';

示例代码

以下是一个完整的示例,展示了如何使用 freemework_cancellation 插件来管理任务的取消。

示例代码

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:freemework_cancellation/freemework_cancellation.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TaskCancellationExample(),
    );
  }
}

class TaskCancellationExample extends StatefulWidget {
  [@override](/user/override)
  _TaskCancellationExampleState createState() => _TaskCancellationExampleState();
}

class _TaskCancellationExampleState extends State<TaskCancellationExample> {
  bool _isTaskRunning = false;
  late CancellationTokenSource _cts;

  [@override](/user/override)
  void initState() {
    super.initState();
    _cts = CancellationTokenSource(); // 创建一个 CancellationTokenSource 实例
  }

  [@override](/user/override)
  void dispose() {
    _cts.dispose(); // 在组件销毁时释放资源
    super.dispose();
  }

  Future<void> _startTask() async {
    if (_isTaskRunning) {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('任务已经在运行中!')));
      return;
    }

    setState(() {
      _isTaskRunning = true;
    });

    try {
      await _runLongTask(_cts.token); // 执行长任务,并传入 CancellationToken
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('任务完成!')));
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('任务被取消!')));
    } finally {
      setState(() {
        _isTaskRunning = false;
      });
    }
  }

  Future<void> _runLongTask(CancellationToken token) async {
    for (int i = 0; i < 10; i++) {
      if (token.isCancellationRequested) {
        throw Exception('任务已被取消');
      }
      print('执行任务中... $i');
      await Future.delayed(Duration(seconds: 1)); // 模拟耗时操作
    }
  }

  void _cancelTask() {
    if (!_isTaskRunning) {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('当前没有任务可以取消!')));
      return;
    }
    _cts.cancel(); // 取消任务
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('任务取消管理示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _isTaskRunning ? null : () => _startTask(),
              child: Text(_isTaskRunning ? '任务正在运行...' : '开始任务'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _isTaskRunning ? _cancelTask : null,
              child: Text(_isTaskRunning ? '取消任务' : '无任务可取消'),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter任务取消管理插件freemework_cancellation的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter任务取消管理插件freemework_cancellation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


freemework_cancellation 是一个用于 Flutter 的任务取消管理插件,它可以帮助你在 Flutter 应用中更好地管理异步任务的取消操作。这个插件特别适用于需要取消长时间运行的任务(如网络请求、文件下载等)的场景。

安装

首先,你需要在 pubspec.yaml 文件中添加 freemework_cancellation 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  freemework_cancellation: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

基本用法

1. 创建 CancellationToken

CancellationToken 是用于控制任务取消的核心对象。你可以通过 CancellationTokenSource 来创建和管理 CancellationToken

import 'package:freemework_cancellation/freemework_cancellation.dart';

void main() {
  final cancellationTokenSource = CancellationTokenSource();
  final cancellationToken = cancellationTokenSource.token;
}

2. 使用 CancellationToken 取消任务

你可以在异步任务中检查 CancellationToken 是否被取消,并在任务被取消时停止执行。

Future<void> longRunningTask(CancellationToken cancellationToken) async {
  for (int i = 0; i < 10; i++) {
    // 检查任务是否被取消
    if (cancellationToken.isCancelled) {
      print('Task was cancelled');
      return;
    }

    // 模拟长时间运行的任务
    await Future.delayed(Duration(seconds: 1));
    print('Task progress: $i');
  }
  print('Task completed');
}

3. 取消任务

你可以通过调用 CancellationTokenSource.cancel() 方法来取消任务。

void main() async {
  final cancellationTokenSource = CancellationTokenSource();
  final cancellationToken = cancellationTokenSource.token;

  // 启动长时间运行的任务
  longRunningTask(cancellationToken);

  // 模拟一段时间后取消任务
  await Future.delayed(Duration(seconds: 3));
  cancellationTokenSource.cancel();
}

高级用法

1. 使用 CancellationTokenFuture

你可以将 CancellationTokenFuture 结合使用,以便在任务被取消时自动停止 Future 的执行。

Future<void> longRunningTaskWithFuture(CancellationToken cancellationToken) async {
  await Future.delayed(Duration(seconds: 5), () {
    if (cancellationToken.isCancelled) {
      print('Task was cancelled');
      return;
    }
    print('Task completed');
  });
}

2. 使用 CancellationTokenStream

你也可以将 CancellationTokenStream 结合使用,以便在任务被取消时自动停止 Stream 的监听。

Stream<int> countStream(CancellationToken cancellationToken) async* {
  for (int i = 0; i < 10; i++) {
    if (cancellationToken.isCancelled) {
      print('Stream was cancelled');
      return;
    }
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

void main() async {
  final cancellationTokenSource = CancellationTokenSource();
  final cancellationToken = cancellationTokenSource.token;

  countStream(cancellationToken).listen((value) {
    print('Stream value: $value');
  });

  // 模拟一段时间后取消任务
  await Future.delayed(Duration(seconds: 3));
  cancellationTokenSource.cancel();
}
回到顶部