Назад к вопросам
Middle
149
questionbank
Как используются стримы в Flutter?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Стримы во Flutter используются для работы с последовательностью асинхронных событий. Они основаны на парадигме реактивного программирования и предоставляют способ обработки данных по мере их поступления.
Основные применения стримов:
- UI-обновления: Прослушивание изменений данных (например, из сетевых запросов или базы данных) и автоматическое обновление виджетов.
- Связь между BLoC/Cubit и UI: BLoC/Cubit используют
Stream(черезStateStreamable) для эмиссии состояний, на которые подписан UI. - Обработка пользовательского ввода: Отслеживание событий ввода (например, из текстовых полей).
- Работа с WebSocket и другие асинхронные операции: Получение данных в реальном времени.
Основные концепции:
- Stream: Последовательность асинхронных событий.
- StreamController: Управляет стримом, позволяет добавлять данные (
add), ошибки (addError) и закрывать стрим (close). - StreamSubscription: Объект, представляющий активную подписку на стрим. Позволяет получать данные (
onData), обрабатывать ошибки (onError) и завершение стрима (onDone).
Пример использования с StreamBuilder:
// Предположим, у нас есть стрим, который эмитит целые числа
Stream<int> countStream = Stream.periodic(Duration(seconds: 1), (count) => count);
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamBuilder<int>(
stream: countStream, // Подписываемся на стрим
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator(); // Пока стрим ждет данных
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}'); // Если произошла ошибка
} else {
return Text('Count: ${snapshot.data}'); // Отображаем последние данные из стрима
}
},
);
}
}
Стримы могут быть:
- Single-subscription: Только один слушатель может быть подписан в любой момент времени. Попытка подписаться второй раз вызовет ошибку.
- Broadcast: Множество слушателей могут подписаться на один и тот же стрим. Данные отправляются всем активным слушателям.
Для обработки стримов часто используются операторы из пакета rxdart, которые предоставляют богатый набор утилит для трансформации, фильтрации и объединения стримов.