Как метод прослушивания потока показывает данные, которые были добавлены через приемник ПОСЛЕ вызова метода прослушивания?

#dart #stream

#dart #поток

Вопрос:

Я изучаю концепцию и практическое использование потоков (хотя и на самом базовом уровне), и я обнаружил, что приведенный ниже код добавляет данные через приемник ПОСЛЕ вызова метода прослушивания. Итак, функция, переданная для прослушивания в качестве аргумента, повторяется снова и снова, пока наша программа не завершится?

Я пытался приостанавливать программу на несколько секунд между каждым вызовом sink.add, но консоль печатала все данные сразу… Я все еще пытаюсь понять, как работает вся концепция.

 void main() {

  //
  // Initialize a "Single-Subscription" Stream controller
  //

  final StreamController ctrl = StreamController();

  //
  // Initialize a single listener which simply prints the data
  // as soon as it receives it
  //

  final StreamSubscription subscription = ctrl.stream.listen((data) => print('$data'));

  //
  // We here add the data that will flow inside the stream
  //

  ctrl.sink.add('my name');
  ctrl.sink.add(1234);
  ctrl.sink.add({'a': 'element A', 'b': 'element B'});
  ctrl.sink.add(123.45);

  //
  // We release the StreamController
  //
  ctrl.close();

}
 

Ответ №1:

Функция, переданная в listen , является обратным вызовом, который Stream вызывается всякий раз, когда данные добавляются в Stream (или до тех пор, пока подписка на поток не будет отменена).

Это объясняется в Stream.listen документации:

При каждом событии данных из этого потока onData вызывается обработчик подписчика.

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