メソッドから戻るためにDartで独自のフューチャーを作成することは可能ですか、それともDart非同期ライブラリーメソッドの1つから常に組み込まれたフューチャーリターンを返す必要がありますか?
以下のように、実際に非同期呼び出し(ファイルの読み取り/ ajax/etc)を行っている場合でも、ローカル変数を取得している場合でも、常にFuture<List<Base>>
を返す関数を定義したいと思います。
List<Base> aListOfItems = ...;
Future<List<Base>> GetItemList(){
return new Future(aListOfItems);
}
フューチャーを作成する必要がある場合は、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(','));
}
_
その他のヒントについては このブログ投稿 を参照してください。
Future<T>value
ファクトリコンストラクタ:
return Future<String>.value('Back to the future!');
@ Fox32には正解が追加されており、コンプリーターのタイプについて言及する必要があります。そうでない場合は例外が発生します
_Exception received is type 'Future<dynamic>' is not a subtype of type 'FutureOr<List<Base>>
_
したがって、コンプリーターの初期化は
var completer= new Completer<List<Base>>();
または、async
メソッドとしてマークすることもできます。
Future<String> myFutureMethod() async {
// do something that takes a while
return 'done';
}