Комментарии (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 — для сложной логики
Лучшие практики
-
Всегда вызывай
close()void dispose() { _controller.close(); super.dispose(); } -
Используй
broadcast()для множественных слушателей -
Обрабатывай ошибки
stream.handleError((error) => []) -
Используй
StreamBuilderв UIStreamBuilder<int>( stream: controller.stream, builder: (context, snapshot) => Text('${snapshot.data}'), )
StreamController — основной инструмент для асинхронных событий в Flutter.