flutter - 如何在 Dart 中取消延迟的 future ?

标签 flutter dart asynchronous future

假设在 Dart/Flutter 中,您有以下代码:

void myOperation() {
  // could be anything
  print('you didn't cancel me!');
}
请注意,操作本身不是异步的并且是无效的——不返回任何内容。
我们希望它在 future 的某个时刻执行,但我们也希望能够取消它(因为已经请求了一个新的操作来取代它)。
我已经开始这样做:
Future.delayed(Duration(seconds: 2), myOperation())
...但这是不可取消的。
您如何准确地安排该“操作”,同时又使其可取消?
我在想……我们可以像这样修改代码:
Future.delayed(Duration(seconds: 2), () {
    if (youStillWantThisToExecute) {
        print('you didn't cancel me!');
    }
});
但这并不是很好,因为它取决于“全局” bool 值……因此,如果 bool 值翻转为 false,则不会完成任何操作,即使是最近请求的操作,也就是我们想要完成的操作。
如果有一种方法可以创建任意数量的操作实例并单独取消它们……或者为每个操作分配一个唯一的 id,然后而不是使用 bool 控件来控制是否会更好执行......有一个“mostRecentId”int或在执行前检查的东西。
无论如何...
CancelableOperation 仅从它的名字就看起来很有希望。
所以,我查看了它的文档:

CancelableOperation.fromFuture(Future inner, {FutureOr onCancel()}) Creates a CancelableOperation wrapping inner. [...] factory


但老实说,这只会让我可怜的脑袋痛得厉害。
我查阅了其他文章、问题和答案,但它们都是某些特定(和复杂)上下文的一部分,并且在任何地方都找不到简单的示例。
有没有办法通过将延迟的 future 包装在其他类中来取消它?
请更有经验的人提供至少一个在 DartPad 中编译的简单、完整、经过验证的示例?
谢谢。

最佳答案

使用定时器:

var t = Timer(Duration(seconds: 400), () async {
   client.close(force: true);
});
...
t.cancel();

关于flutter - 如何在 Dart 中取消延迟的 future ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66380613/

相关文章:

flutter - 使容器小部件垂直填充父级

flutter - 如何将 Flutter 的 ExpansionPanelList 小部件的默认框装饰更改为圆角矩形框

Flutter-关于在 Cloud Firestore 中创建聊天应用时的读取数

regex - Dart RegExp:具有多种模式的单次通过?

scala - 我怎样才能压平这个 Future[T] 结构?

node.js - 使用 mocha 单元测试异步 waterfall

listview - flutter 调整ListView child 的宽度

flutter - 小部件Flutter的条件渲染

arrays - 错误:未为类 'datauser'定义 setter/getter '_MyHomePageState'

javascript - 使用 fs.readFile 的简单 nodejs 回调示例