【发布时间】:2021-05-28 12:38:54
【问题描述】:
假设在 Dart/Flutter 中有以下代码:
void myOperation() {
// could be anything
print('you didn't cancel me!');
}
请注意,操作本身不是异步的并且是无效的——不返回任何内容。
我们希望它在未来的某个时间执行,但我们也希望能够取消它(因为已经请求了一个取代它的新操作)。
我已经开始这样做了:
Future.delayed(Duration(seconds: 2), myOperation())
...但这是不可取消的。
您如何准确地安排该“操作”,同时使其可取消?
我在想...我们可以像这样修改代码:
Future.delayed(Duration(seconds: 2), () {
if (youStillWantThisToExecute) {
print('you didn't cancel me!');
}
});
但这并不是很好,因为它依赖于“全局”布尔值......因此,如果布尔值被翻转为 false,则不会完成任何操作,即使是最近请求的操作,也就是我们想要完成的操作.
如果有一种方法可以创建任意数量的操作实例并逐个取消它们会更好...或者为每个操作分配一个唯一的 ID,而不是使用布尔控件是否执行...有一个“mostRecentId” int 或在执行前检查的东西。
无论如何...
CancelableOperation 光看名字就很有希望。
所以,我查看了它的文档:
CancelableOperation.fromFuture(Future inner, {FutureOr onCancel()}) 创建一个 CancelableOperation 包装内部。 [...] 工厂
但老实说,这只是让我可怜的头疼得厉害。
我查阅了其他文章、问题和答案,但它们都是某些特定(和复杂)上下文的一部分,在任何地方都找不到简单的示例。
有没有办法通过将延迟的未来包装在其他类中来取消它?
能否请更有经验的人提供至少一个在 DartPad 中编译的简单、完整、经过验证的示例?
谢谢。
【问题讨论】:
-
您是否愿意接受其他不使用 CancelableOperation 的建议?
-
@YoBo 我想知道
标签: flutter dart asynchronous future