Стримы во Flutter используются для работы с последовательностью асинхронных событий. Они основаны на парадигме реактивного программирования и предоставляют способ обработки данных по мере их поступления.
Основные применения стримов:
- UI-обновления: Прослушивание изменений данных (например, из сетевых запросов или базы данных) и автоматическое обновление виджетов.
- Связь между BLoC/Cubit и UI: BLoC/Cubit используют
Stream (через StateStreamable) для эмиссии состояний, на которые подписан UI.
- Обработка пользовательского ввода: Отслеживание событий ввода (например, из текстовых полей).
- Работа с WebSocket и другие асинхронные операции: Получение данных в реальном времени.
Основные концепции:
- Stream: Последовательность асинхронных событий.
- StreamController: Управляет стримом, позволяет добавлять данные (
add), ошибки (addError) и закрывать стрим (close).
- StreamSubscription: Объект, представляющий активную подписку на стрим. Позволяет получать данные (
onData), обрабатывать ошибки (onError) и завершение стрима (onDone).
Пример использования с StreamBuilder:
dart
Стримы могут быть:
- Single-subscription: Только один слушатель может быть подписан в любой момент времени. Попытка подписаться второй раз вызовет ошибку.
- Broadcast: Множество слушателей могут подписаться на один и тот же стрим. Данные отправляются всем активным слушателям.
Для обработки стримов часто используются операторы из пакета rxdart, которые предоставляют богатый набор утилит для трансформации, фильтрации и объединения стримов.