Для вашего первого примера countStream - это Stream целого числа, разработанный с asyn c*. (позаботьтесь о звезде)
В этом определении потока Yield испускает новое целое число в потоке потока (целое число, как сказано stream .
Если вы используете поток, вы получите 0,1,2,3,4, ..., max-1
Во втором фрагменте прочитайте его как: sumStream is a Future, который должен возвращать int.
В более общем случае экземпляр Future создает значение типа T.
sumStream будет использовать поток (заданный в параметре) и до тех пор, пока это Поток имеет значения, суммируйте их и верните последнюю сумму, когда закончите. Sum - целое число: это нормально для определения Future.
Используя оба, вы можете иметь:
> void main() async {
print(await sumStream(countStream(5)));
}
результат: 10 (0 + 1 + 2 + 3 + 4)
Поскольку sumStream является Future, main может ожидать асинхронного выполнения: она объявляет о своем намерении использовать функцию asyn c (asyn *) 1047 * объявление), тогда он может использовать await, чтобы остановить собственное выполнение, пока не вернется sumStream.
Другой способ, если вы выйдете из main ut asyn c - добавить в будущее предложение .then :
void main() {
sumStream(countStream(5)).then((x)=>print(x));
print("after sumStream");
}
Результат:
после sumStream
10
Как вы можете видеть, что основной проход через sumStream начался, но он еще не завершен, и сначала выведите («после sumStream»).
Затем основной завершен, но Дарт знает, что все еще выполняется асинхронное задание c. и он будет ждать, пока все не будет сделано, поэтому мы можем увидеть результат, но как только Future sumStream будет завершен.
HTH