😇

【Flutter/Dart】Completerクラスを使ってFutureを利用するメソッドを自作しよう

2022/04/15に公開

Completerとは

・Futureオブジェクトを生成し、後で値またはエラーを使用してそれらを完了する方法
https://api.flutter.dev/flutter/dart-async/Completer-class.html

どんな時に使用するのか?

Futureを最初から作成する必要がある場合
(例えば、コールバックベースのAPIをFutureベースのAPIに変換する場合)
※コールバック関数:関数に引数として渡される関数のこと

実際にCompleterを使ってみよう

まず初めに、Completerオブジェクトを作成します。
次に、非同期的な処理を行い、その中でCompleterのcomplete(T value)メソッドを呼び出すことで、対応するFutureの処理を完了させることができます。
そして、Completerの持つfutureオブジェクトを返り値として返します。
最後に、呼び出し側でFutureを処理すれば、非同期処理の完了です。これで非同期なメソッドを実装することができました。

import 'dart:async';

main() {
  asyncMethod().then((message) => print(message));
}

Future<String> asyncMethod() {
  // Completer<T>を作成
  var completer = new Completer<String>();
  
  // 何かしら非同期な処理が完了したときに
  // Completer<T>のcomplete<T value>メソッドを呼び出して処理を完了させる
  new Timer(new Duration(seconds: 1), () => completer.complete("done."));
  
  // Completerの持つFutureオブジェクトを返す
  return completer.future;
}

Discussion