Ich mache eine Anwendung mit Flatter-Framework. Dabei bin ich auf die Schlüsselwörter in Dart async
und gestoßen async*
. Kann mir jemand sagen, was der Unterschied zwischen ihnen ist?
Ich mache eine Anwendung mit Flatter-Framework. Dabei bin ich auf die Schlüsselwörter in Dart async
und gestoßen async*
. Kann mir jemand sagen, was der Unterschied zwischen ihnen ist?
Antworten:
Markieren einer Funktion als async
oder async*
ermöglicht die Verwendung von async
/ await
keyword zur Verwendung von a Future
.
Der Unterschied zwischen beiden besteht darin, dass async*
immer a zurückgegeben wird Stream
und etwas Syntaxzucker angeboten wird, um einen Wert über das yield
Schlüsselwort auszugeben.
Wir können daher Folgendes tun:
Stream<int> foo() async* {
for (int i = 0; i < 42; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
Diese Funktion gibt jede Sekunde einen Wert aus, der jedes Mal erhöht wird
async
gibt dir eine Future
async*
gibt dir eine Stream
.Sie fügen das async
Schlüsselwort einer Funktion hinzu, die einige Arbeiten ausführt, die möglicherweise lange dauern. Es gibt das in a eingeschlossene Ergebnis zurück Future
.
Future<int> doSomeLongTask() async {
await Future.delayed(const Duration(seconds: 1));
return 42;
}
Sie können dieses Ergebnis erzielen, indem Sie auf die Zukunft warten:
main() async {
int result = await doSomeLongTask();
print(result); // prints '42' after waiting 1 second
}
Sie fügen das async*
Schlüsselwort hinzu, um eine Funktion zu erstellen, die nacheinander eine Reihe zukünftiger Werte zurückgibt. Die Ergebnisse werden in einen Stream eingeschlossen.
Stream<int> countForOneMinute() async* {
for (int i = 1; i <= 60; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
Der Fachbegriff hierfür lautet asynchrone Generatorfunktion . Sie verwendenyield
geben einen Wert zurück, anstatt return
die Funktion nicht zu verlassen.
Sie können verwenden await for
, um auf jeden vom Stream ausgegebenen Wert zu warten.
main() async {
await for (int i in countForOneMinute()) {
print(i); // prints 1 to 60, one integer per second
}
}
Sehen Sie sich diese Videos an, um mehr zu erfahren, insbesondere über Generatoren:
Dart Documentation
sowie eine Referenz zu lesen :)