#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
вызывается обработчик подписчика.…
Пока подписка приостановлена или когда она была отменена, подписка не получает события, и ни одна из функций обработчика событий не вызывается.