フラッターフレームワークを使用してアプリケーションを作成しています。この間、Dartasyncとのキーワードに出くわしましたasync*。誰かがそれらの違いは何ですか?
回答:
関数をとしてマークするasyncかasync*、async/awaitキーワードを使用してを使用できるようにしますFuture。
両方の違いは、async*常にaStreamを返し、yieldキーワードを介して値を出力するための構文糖衣構文を提供することです。
したがって、次のことができます。
Stream<int> foo() async* {
for (int i = 0; i < 42; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
この関数は毎秒値を出し、その値は毎回インクリメントします
async あなたに Futureasync*あなたにStream。async時間がかかる可能性のある作業を行う関数にキーワードを追加します。でラップされた結果を返しますFuture。
Future<int> doSomeLongTask() async {
await Future.delayed(const Duration(seconds: 1));
return 42;
}
あなたは未来を待つことによってその結果を得ることができます:
main() async {
int result = await doSomeLongTask();
print(result); // prints '42' after waiting 1 second
}
async*キーワードを追加して、将来の値の束を一度に1つずつ返す関数を作成します。結果はストリームにラップされます。
Stream<int> countForOneMinute() async* {
for (int i = 1; i <= 60; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
これの専門用語は非同期ジェネレーター関数です。関数を離れないためではなくyield、値を返すために使用しreturnます。
await forストリームから発行される各値を待機するために使用できます。
main() async {
await for (int i in countForOneMinute()) {
print(i); // prints 1 to 60, one integer per second
}
}
詳細については、これらのビデオ、特にジェネレーターに関するビデオをご覧ください。
Dart Documentation参考資料と同様に読むのも良いでしょう:)