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

Что такое Stream Controller?

2.0 Middle🔥 11 комментариев
#Dart

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

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

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

StreamController в Dart и Flutter

StreamController — это инструмент для создания и управления Streams, позволяя генерировать события и отправлять их слушателям.

Что такое StreamController

final controller = StreamController<int>();

controller.stream.listen((value) {
  print('Received: $value');
});

controller.add(1);
controller.add(2);
controller.close();

Основные операции

controller.add(value);           // Отправить данные
controller.addError(error);      // Отправить ошибку
controller.close();              // Завершить stream

Пример 1: Простой counter

class CounterNotifier {
  final _controller = StreamController<int>();
  Stream<int> get stream => _controller.stream;
  int _counter = 0;
  
  void increment() {
    _controller.add(++_counter);
  }
  
  void dispose() => _controller.close();
}

class CounterWidget extends StatefulWidget {
  @override
  State<CounterWidget> createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  final notifier = CounterNotifier();
  
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<int>(
      stream: notifier.stream,
      initialData: 0,
      builder: (context, snapshot) {
        return Column(
          children: [
            Text('Count: ${snapshot.data}'),
            ElevatedButton(
              onPressed: notifier.increment,
              child: Text('Increment'),
            ),
          ],
        );
      },
    );
  }
  
  @override
  void dispose() {
    notifier.dispose();
    super.dispose();
  }
}

Broadcast для множественных слушателей

final controller = StreamController<String>.broadcast();

controller.stream.listen((v) => print('Listener 1: $v'));
controller.stream.listen((v) => print('Listener 2: $v'));
controller.add('Event');

Пример с обработкой ошибок

class DataRepository {
  final _controller = StreamController<List<User>>();
  Stream<List<User>> get stream => _controller.stream;
  
  Future<void> fetchUsers() async {
    try {
      final users = await api.getUsers();
      _controller.add(users);
    } catch (e) {
      _controller.addError(e);
    }
  }
  
  void dispose() => _controller.close();
}

Типы StreamController

Обычный:

final controller = StreamController<int>();
// Только один слушатель

Broadcast:

final controller = StreamController<int>.broadcast();
// Множество слушателей

Когда использовать

✅ Управление событиями ✅ Создание notifier'ов ✅ Трансформация данных

❌ Лучше альтернативы:

  • ValueNotifier — для одного значения
  • StateNotifier (Riverpod) — для состояния
  • BLoC — для сложной логики

Лучшие практики

  1. Всегда вызывай close()

    void dispose() {
      _controller.close();
      super.dispose();
    }
    
  2. Используй broadcast() для множественных слушателей

  3. Обрабатывай ошибки

    stream.handleError((error) => [])
    
  4. Используй StreamBuilder в UI

    StreamBuilder<int>(
      stream: controller.stream,
      builder: (context, snapshot) => Text('${snapshot.data}'),
    )
    

StreamController — основной инструмент для асинхронных событий в Flutter.

Что такое Stream Controller? | PrepBro