← Назад к вопросам

Как используешь стримы в Dart?

1.8 Middle🔥 131 комментариев
#Dart

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Использование Streams в Dart

Streams — основа реактивного программирования. Это последовательность асинхронных событий.

StreamController

final controller = StreamController<int>();
controller.sink.add(1);
controller.stream.listen((value) => print(value));
controller.close();

StreamBuilder для UI

StreamBuilder<int>(
  stream: counterStream,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text("Count: ${snapshot.data}");
    }
    return CircularProgressIndicator();
  },
)

Async generators

Stream<int> countStream() async* {
  for (int i = 0; i < 10; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

Stream трансформации

map — преобразование

numberStream.map((n) => n * 2)

where — фильтрация

numberStream.where((n) => n % 2 == 0)

debounceTime — уменьшить частоту

searchStream.debounceTime(Duration(milliseconds: 500))

distinct — только новые значения

userStream.distinct()

BLoC Pattern

BLoC разделяет логику от UI через Streams.

class CounterBloc {
  final _counter = StreamController<int>();
  Stream<int> get count => _counter.stream;
  
  void increment() => _counter.sink.add(_count + 1);
  
  void dispose() => _counter.close();
}

Типичное использование

  1. Real-time данные — слушать обновления
  2. Пользовательский ввод — search, filters
  3. WebSocket — двусторонняя коммуникация
  4. Sensor data — GPS, accelerometer
  5. Notification — в реальном времени

Best Practices

  • Всегда закрывай StreamControllers в dispose()
  • Используй async* для создания Streams
  • Обрабатывай ошибки через onError callback
  • Используй StateManagement (Provider, Riverpod)
  • Избегай утечек памяти через многократное слушание

Streams — мощный инструмент для асинхронного программирования в Flutter.