Flutter插件ctmanager的使用方法

Flutter插件ctmanager的使用方法

在本篇文章中,我们将探讨一个名为 ctmanager 的 Flutter 插件,该插件主要用于管理多个取消令牌(CancellationToken),并展示其在不同场景下的潜在用途。该插件可以帮助我们更轻松地处理一些可以被用户取消的操作,如 HTTP 请求或图像处理等。

注意事项

请注意,此插件并不实际取消已执行的操作,而只是防止在取消时挂起的 await 进程。对于 HTTP 请求或图像处理等操作,你可能需要添加额外的机制来处理取消事件。

使用方法

CTManager 可以作为单例使用,也可以作为新实例使用。让我们通过几个示例来看看如何使用它。

单例方式

final newCancelToken = CTManager.I.create(
    token: 'ct1',
    operation: Future.delayed(
        const Duration(seconds: 5), 
        () => 'done',
    ),
    // 可选参数
    onCancel: () => print('cancelled'),
);

非单例方式

final ctManager = CTManager();
final newCancelToken = ctManager.create(
    token: 'ct1',
    operation: Future.delayed(
        const Duration(seconds: 5), 
        () => 'done',
    ),
    // 可选参数
    onCancel: () => print('cancelled'),
);

注意:token 字段不能为 null

在这两个示例中,newCancelToken 都是一个新的 CancellationToken<String, String?> 实例,因为 token 是一个 String,且 operation 的返回值也是一个 String

示例 1

// 该操作将在3秒后被取消。
Future.delayed(
    const Duration(seconds: 3), 
    newCancelToken.cancel,
);

final result = await newCancelToken.result;

// 因为该操作永远不会返回 `null`,
// 我们只需要检查它是否为 `null`。
// 如果是,则表示该操作已被取消。
if(result == null) {
    print('操作在3秒后被取消');
} else {
    print('操作成功完成');
}

示例 2

final nullableValueCancelToken = CTManager.I.create(
    token: 'ct1',
    operation: Future.delayed(
        const Duration(seconds: 5), 
        () => 1 < 2 ? null : 'done',
    ),
);

// 该操作将在3秒后被取消。
Future.delayed(
    const Duration(seconds: 3), 
    nullableValueCancelToken.cancel,
);

final result = await nullableValueCancelToken.result;

if(nullableValueCancelToken.isCompleted) {
    if(result == null) {
        print('操作成功完成,结果为 null');
    } else {
        print('操作成功完成,结果不为 null');
    }
} else {
    print('操作在3秒后被取消');
}

其他功能

除了上述示例外,CTManager 还提供了其他一些有用的功能,如查找特定的取消令牌、检查令牌是否存在,以及直接运行操作等。

查找取消令牌

final findToken = CTManager.I.of<String, String>('ct1');
// 注意:在检查令牌之前,请确保检查 `[findToken]` 是否为 `null`。
// 如果是 `null`,则表示要查找的令牌可能已经被取消、已完成或者从未创建过。

检查令牌是否存在

final bool isStillRunning = CTManager.I.hasTokenOf('ct1');
// 或者
// final bool isNotRunning = CTManager.I.noTokenOf('ct1'); 

取消令牌

CTManager.I.cancel('ct1');

直接运行操作

如果已经知道 operation 不会返回 null,可以直接运行它。

final result = await CTManager.I.run(
    token: 'ct1',
    operation: Future.delayed(
        const Duration(seconds: 5), 
        () => print('done'),
    ),
);

// 要取消操作,只需调用
// CTManager.I.cancel('ct1');
// 在操作完成之前调用。
// 请注意,即使在取消后,`print('done')` 仍然会被执行,这是正常的。

完整示例 Demo

以下是一个完整的示例,展示了如何在 Flutter 应用程序中使用 ctmanager 插件。

import 'package:flutter/material.dart';
import 'package:ctmanager/ctmanager.dart';

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

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

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

class _HomeScreenState extends State<HomeScreen> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('CTManager Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            example1();
            example2();
            example1_2();
            example3();
          },
          child: Text('Run Examples'),
        ),
      ),
    );
  }

  Future<void> example1() async {
    final ctManager = CTManager();
    final newCancelToken = ctManager.create(
      token: 'ct1',
      operation: Future.delayed(
        const Duration(seconds: 5),
        () => 'done',
      ),
      // 可选参数
      onCancel: () => print('[example1]: cancelled'),
    );
    // 该操作将在3秒后被取消。
    Future.delayed(
      const Duration(seconds: 3),
      newCancelToken.cancel,
    );

    final result = await newCancelToken.result;
    // 因为该操作永远不会返回 `null`,
    // 我们只需要检查它是否为 `null`。
    // 如果是,则表示该操作已被取消。
    if (result == null) {
      print('[example1]: 操作在3秒后被取消');
    } else {
      print('[example1]: 操作成功完成');
    }
  }

  Future<void> example2() async {
    final nullableValueCancelToken = CTManager.I.create(
      token: 'ct1',
      operation: Future.delayed(
        const Duration(seconds: 5),
        () => 1 < 2 ? null : 'done',
      ),
      // 可选参数
      onCancel: () => print('[example2]: cancelled'),
    );
    // 该操作将在3秒后被取消。
    Future.delayed(
      const Duration(seconds: 3),
      nullableValueCancelToken.cancel,
    );

    final result = await nullableValueCancelToken.result;
    if (nullableValueCancelToken.isCompleted) {
      if (result == null) {
        print('[example2]: 操作成功完成,结果为 null');
      } else {
        print('[example2]: 操作成功完成,结果不为 null');
      }
    } else {
      print('[example2]: 操作在3秒后被取消');
    }
  }

  Future<void> example1_2() async {
    CTManager.I.run(
      token: 'ct2',
      operation: Future.delayed(
        const Duration(seconds: 5),
        () => print('[example1_2]: done'),
      ),
      onCancel: () => print('[example1_2]: cancelled'),
    );
    // 取消操作在3秒后
    Future.delayed(
      const Duration(seconds: 3),
      () => CTManager.I.cancel('ct2'),
    );
  }

  Future<void> example3() async {
    final ct3 = CTManager.I.create(
      token: 'ct3',
      operation: Future.delayed(const Duration(seconds: 1), () => 'done ct3'),
    );
    final ct3result = await ct3.result;
    if (ct3result != null && ct3.isCompleted) {
      print('[example3]: 结果为 `$ct3result`');
    } else {
      print('[example3]: 操作被取消');
    }
  }
}

更多关于Flutter插件ctmanager的使用方法的实战教程也可以访问 https://www.itying.com/category-92-b0.html

回到顶部