web-dev-qa-db-ja.com

ダート、あなた自身の機能に戻る未来を作る方法は?

メソッドから戻るためにDartで独自のフューチャーを作成することは可能ですか、それともDart非同期ライブラリーメソッドの1つから常に組み込まれたフューチャーリターンを返す必要がありますか?

以下のように、実際に非同期呼び出し(ファイルの読み取り/ ajax/etc)を行っている場合でも、ローカル変数を取得している場合でも、常にFuture<List<Base>>を返す関数を定義したいと思います。

List<Base> aListOfItems = ...;

Future<List<Base>> GetItemList(){

    return new Future(aListOfItems);

}
41
Daniel Robinson

フューチャーを作成する必要がある場合は、Completerを使用できます。ドキュメントの Completer class を参照してください。次に例を示します。

_Future<List<Base>> GetItemList(){
  var completer = new Completer<List<Base>>();

  // At some time you need to complete the future:
  completer.complete(new List<Base>());

  return completer.future;
}
_

しかし、ほとんどの場合、コンプリーターで未来を作成する必要はありません。この場合のように:

_Future<List<Base>> GetItemList(){
  var completer = new Completer();

  aFuture.then((a) {
    // At some time you need to complete the future:
    completer.complete(a);
  });

  return completer.future;
}
_

コンプリーターを使用すると、コードが非常に複雑になる可能性があります。 then()Futureを返すため、代わりに次のコードを使用できます。

_Future<List<Base>> GetItemList(){
  return aFuture.then((a) {
    // Do something..
  });
}
_

またはファイルioの例:

_Future<List<String>> readCommaSeperatedList(file){
  return file.readAsString().then((text) => text.split(','));
}
_

その他のヒントについては このブログ投稿 を参照してください。

72
Fox32

Future<T>value ファクトリコンストラクタ:

return Future<String>.value('Back to the future!');
21
Sebastian Engel

@ Fox32には正解が追加されており、コンプリーターのタイプについて言及する必要があります。そうでない場合は例外が発生します

_Exception received is type 'Future<dynamic>' is not a subtype of type 'FutureOr<List<Base>>_

したがって、コンプリーターの初期化は

var completer= new Completer<List<Base>>();

6
silentsudo

または、asyncメソッドとしてマークすることもできます。

Future<String> myFutureMethod() async {

  // do something that takes a while

  return 'done';
}
2
Suragch