12

「m3」の前に、「completer.future.isComplete」で Future が完了したかどうかを確認できましたが、これはなくなったようです。代替品はありますか?または、自分で保存する必要がありますか(_CompleterImpl内にはまだフィールド「_isComplete」があるようですが、公開されていません

4

3 に答える 3

9

M3 Dart では、独自のフラグを使用するのが最善です。

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

Dart はシングル スレッド言語なので、競合状態はありません。[action] 関数は、この Future が完了すると呼び出されることに注意してください。

于 2013-01-25T22:04:54.177 に答える
3

@Cutchの解決策の代わりに、Futureを a でラップすることもでき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 に答える