Spec-Zone.ru › Dart 2

dart:async

Поток<T>.периодический конструктор

Поток<T>.периодический(
  1. Duration период,
  2. [T вычисление(
    1. int номерВычисления
    )?]
)

Создаёт поток, который многократно испускает события через period интервалы.

Значения событий вычисляются путём вызова computation. Аргументом этого обратного вызова является целое число, которое начинается с 0 и увеличивается для каждого события.

Значение period должно быть неотрицательной Duration.

Если computation опущено, значения событий будут все null.

Значение computation нельзя опускать, если тип события T не допускает null в качестве значения.

Пример:

final stream =
    Stream<int>.periodic(const Duration(
        seconds: 1), (count) => count * count).take(5);

stream.forEach(print); // Outputs event values 0,1,4,9,16.

Реализация

factory Stream.periodic(Duration period,
    [T computation(int computationCount)?]) {
  if (computation == null && !typeAcceptsNull<T>()) {
    throw ArgumentError.value(null, "computation",
        "Must not be omitted when the event type is non-nullable");
  }
  var controller = _SyncStreamController<T>(null, null, null, null);
  // Counts the time that the Stream was running (and not paused).
  Stopwatch watch = new Stopwatch();
  controller.onListen = () {
    int computationCount = 0;
    void sendEvent(_) {
      watch.reset();
      if (computation != null) {
        T event;
        try {
          event = computation(computationCount++);
        } catch (e, s) {
          controller.addError(e, s);
          return;
        }
        controller.add(event);
      } else {
        controller.add(null as T); // We have checked that null is T.
      }
    }

    Timer timer = Timer.periodic(period, sendEvent);
    controller
      ..onCancel = () {
        timer.cancel();
        return Future._nullFuture;
      }
      ..onPause = () {
        watch.stop();
        timer.cancel();
      }
      ..onResume = () {
        Duration elapsed = watch.elapsed;
        watch.start();
        timer = new Timer(period - elapsed, () {
          timer = Timer.periodic(period, sendEvent);
          sendEvent(null);
        });
      };
  };
  return controller.stream;
}

© 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.periodic.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API