Одноразовые и широковещательные потоки
Выбор подходящего потока для множества слушателей
«Одноразовые и широковещательные потоки» — бесплатный урок Dart Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Dart Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Dart Academy содержит 4 уроков всего.
Два вида потоков
Потоки Dart бывают двух видов: single-subscription и broadcast. Выбор подходящего вида зависит от необходимого количества прослушивателей.
Потоки с одной подпиской
Поток single-subscription допускает ровно одного прослушивателя в течение всего срока существования. Это тип по умолчанию, подходящий для одноразовой последовательности, например чтения файла. 📄
Только одно прослушивание
Попробуйте дважды прослушать поток с одной подпиской — Dart выдаст StateError. Поток помнит, что у него уже есть единственный прослушиватель.
final s = Stream.fromIterable([1, 2]);
s.listen(print);
s.listen(print); // throws StateErrorБуферизация до начала прослушивания
Поток с одной подпиской терпеливо ждёт. Он не создаёт события, пока кто-либо не начнёт его прослушивать, поэтому ни одно значение не будет пропущено.
Трансляционные потоки
Поток broadcast позволяет одновременно подписаться множеству прослушивателей. Каждый активный прослушиватель получает одни и те же события по мере их возникновения. 📡
Преобразование в broadcast
Превратите поток с одной подпиской в общий, вызвав asBroadcastStream. Теперь к нему могут подключиться несколько прослушивателей.
final shared = source.asBroadcastStream();
shared.listen(print);
shared.listen((v) => log(v));Поздние прослушиватели пропускают события
Потоки broadcast не используют буферизацию. Прослушиватель, который подписался поздно, видит только события, выданные с этого момента, но не предыдущие.
Контроллеры определяют тип
StreamController по умолчанию создаёт поток с одной подпиской. Если нужны несколько прослушивателей, используйте конструктор broadcast.
final ctrl = StreamController<int>.broadcast();
ctrl.stream.listen(print);Когда использовать single-subscription
Выбирайте поток single-subscription, когда данные один раз поступают одному получателю, например байты сетевого ответа или содержимое прочитанного файла.
Когда использовать broadcast
Выбирайте поток broadcast для постоянно возникающих событий, которые важны нескольким частям приложения, например нажатий кнопок или обновлений показаний датчиков.
Проверка перед прослушиванием
Не уверены, какой у Вас тип? Свойство isBroadcast сообщит это, и Вы избежите StateError при двойном прослушивании потоков с одной подпиской.
if (!stream.isBroadcast) {
// only one listener allowed
}Быстрая проверка
Какой поток подходит для множества прослушивателей?
Итоги
Потоки с одной подпиской обслуживают one прослушивателя и буферизуют данные до чтения; потоки broadcast обслуживают многих, но пропускают уже выданные события. Выбирайте поток по количеству прослушивателей. 🎉
Часто задаваемые вопросы
Урок «Одноразовые и широковещательные потоки» бесплатный?
Да — полный текст урока «Одноразовые и широковещательные потоки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Dart Academy, подпишись на CoddyKit PRO. Курс Dart Academy содержит 4 уроков всего.
Чему я научусь в уроке «Одноразовые и широковещательные потоки»?
Выбор подходящего потока для множества слушателей Ты практикуешь Dart Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Dart Academy?
Предыдущий опыт не требуется. Dart Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Одноразовые и широковещательные потоки»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Dart Academy?
Да. Каждый урок Dart Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Прослушивание с await for
- Одноразовые и широковещательные потоки
- Преобразование потоков: map, where, take
- Создание потоков с async*