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