12

在“m3”之前,您可以使用“completer.future.isComplete”检查 Future 是否已完成,这似乎已经消失了。有替代品吗?还是我需要自己保存它(似乎 _CompleterImpl 内部仍然有一个字段 '_isComplete' 但它没有暴露

4

3 回答 3

9

使用 M3 Dart,最好只使用您自己的标志。

future.whenComplete(() {
  tweenCompleted = true;
});

Dart 是一种单线程语言,因此这里没有竞争条件。请注意,当这个未来完成时,会调用 [action] 函数,无论它是使用值还是错误完成。

于 2013-01-25T22:04:54.177 回答
3

@Cutch的解决方案的替代方法是将Futurea包装起来Completer

Completer<T> wrapInCompleter<T>(Future<T> future) {
  final completer = Completer<T>();
  future.then(completer.complete).catchError(completer.completeError);
  return completer;
}

Future<void> main() async {
  final completer = wrapInCompleter(asyncComputation());
  if (completer.isCompleted) {
    final result = await completer.future;
    // do your stuff
  }
}

这种方法更有资源,因为您既可以异步等待完成,也可以检查未来是否同步完成。

于 2021-10-27T00:07:27.673 回答
1

使用 Future 的扩展并以 Hugo Passos 的回答为基础:

extension FutureExtension<T> on Future<T> {
  /// Checks if the future has returned a value, using a Completer.
  bool isCompleted() {
    final completer = Completer<T>();
    then(completer.complete).catchError(completer.completeError);
    return completer.isCompleted;
  }
}
于 2022-01-28T08:42:00.200 回答