Ответ вслух Senior Dart: Future, Stream, изоляты обновлено

Stream в продакшене: подписки, ошибки, утечки

Вопрос

Как вы работаете со Stream в реальном приложении: подписки, ошибки, отмена, преобразования?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Для данных, которые читает один потребитель, вроде ответа файла, беру single-subscription. Для событий, которые слушают несколько экранов, broadcast, помня, что поздний подписчик пропустит старые события.

Что должно прозвучать в ответе

  • Виды: single-subscription и broadcast, когда какой

  • Каждая подписка отменяется в `dispose`, контроллер закрывает владелец

  • Ошибки: `onError` в `listen`, `handleError`, без обработчика ошибка уходит в зону

  • Преобразования: `map`, `where`, `distinct`, `asyncMap`, `asyncExpand`

  • В UI: `StreamBuilder` сам подписывается и отписывается, но stream создаётся вне `build`

  • Пауза и обратное давление: `pause`/`resume`, буферизация single-subscription

Что могут спросить следом

  • Почему StreamBuilder(stream: repo.watch()) в build плох?
  • Как сделать debounce поиска на Stream?
  • Чем asyncMap отличается от asyncExpand?

Разбор

Образцовый ответ: «Для данных, которые читает один потребитель, вроде ответа файла, беру single-subscription. Для событий, которые слушают несколько экранов, broadcast, помня, что поздний подписчик пропустит старые события. Главное правило: кто подписался, тот отменяет: StreamSubscription храню в State и вызываю cancel в dispose, а StreamController закрывает его владелец. Ошибки обрабатываю явно, иначе они уходят в зону. Для преобразований where, map, distinct, asyncMap для асинхронной обработки по одному, debounce через rxdart или трансформер событий в BLoC. В UI использую StreamBuilder, но stream создаю в initState или беру из провайдера: если вызвать repo.watch() прямо в build, на каждом перестроении будет новая подписка и мигание»

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.