Поток< T>.fromIterable конструктор
-
Iterable<
T> элементы
Создает поток, получающий данные из elements.
Перебор итерируемого объекта происходит при получении подписчика потоком и прекращается, если подписчик отменяет подписку или метод Iterator.moveNext возвращает false или выбрасывает исключение. Перебор приостанавливается, пока подписка на поток приостановлена.
Если вызов метода Iterator.moveNext на elements.iterator вызывает исключение, поток выводит это исключение, а затем закрывается. Если чтение значения Iterator.current на elements.iterator вызывает исключение, поток выводит это исключение, но продолжает перебор.
К потоку можно подключаться несколько раз. Каждый подписчик перебирает elements независимо.
Пример:
final numbers = [1, 2, 3, 5, 6, 7]; final stream = Stream.fromIterable(numbers);
Реализация
factory Stream.fromIterable(Iterable<T> elements) =>
Stream<T>.multi((controller) {
Iterator<T> iterator;
try {
iterator = elements.iterator;
} catch (e, s) {
controller.addError(e, s);
controller.close();
return;
}
var zone = Zone.current;
var isScheduled = true;
void next() {
if (!controller.hasListener || controller.isPaused) {
// Cancelled or paused since scheduled.
isScheduled = false;
return;
}
bool hasNext;
try {
hasNext = iterator.moveNext();
} catch (e, s) {
controller.addErrorSync(e, s);
controller.closeSync();
return;
}
if (hasNext) {
try {
controller.addSync(iterator.current);
} catch (e, s) {
controller.addErrorSync(e, s);
}
if (controller.hasListener && !controller.isPaused) {
zone.scheduleMicrotask(next);
} else {
isScheduled = false;
}
} else {
controller.closeSync();
}
}
controller.onResume = () {
if (!isScheduled) {
isScheduled = true;
zone.scheduleMicrotask(next);
}
};
zone.scheduleMicrotask(next);
});
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.18.5/dart-async/Stream/Stream.fromIterable.html