프로그래밍/Flutter & Dart
[Flutter] Stream Controller
*%$@$#@
2023. 1. 13. 14:36
728x90
반응형
1. Stream Controller
StreamController는 스트림을 제어하는 도구 중 하나입니다.
각각의 StreamController는 'sink'와 'stream'이라는 두 개의 오브젝트를 갖습니다.
sink는 스트림에 데이터를 넣어주는(push) 역할을 하며, stream은 데이터 파이프를 타고 넘어오는 데이터를 꺼내는(receive)데 사용합니다.
import 'dart:async';
void main() async {
// create a StreamController
final streamController = StreamController();
// listen to events
streamController.stream.listen(print);
// push events
streamController.sink.add('Flutter from Zero to Hero');
streamController.sink.add(100);
// When you no longer need to use the controller, you can close it by using close()
await Future.delayed(Duration(seconds: 2));
await streamController.close();
}
Output :
Flutter from Zero to Hero
100
두 개의 소스가 동시에 스트림을 구독(subscription)하는 상황을 만들어 봅시다.
import 'dart:async';
void main() {
var streamController = StreamController();
// the first subscription
streamController.stream.listen((event) {
print('first subscription: $event');
});
// the second subscription
streamController.stream.listen((event) {
print('second subscription: ${event + event}');
});
// push events
streamController.sink.add(1);
streamController.sink.add(100);
}
Output :
Uncaught Error: Bad state: Stream has already been listened to.
위와 같은 에러가 발생하게 됩니다. 기본적으로 스트림은 하나 이상의 구독을 가질 수 없습니다.
이를 해결하기 위해서 처음 StreamController를 생성할 때 broadcast를 정의하면 복수의 구독을 가질 수 있게 됩니다.
import 'dart:async';
void main() {
var streamController = StreamController.broadcast();
// the first subscription
streamController.stream.listen((event) {
print('first subscription: $event');
});
// the second subscription
streamController.stream.listen((event) {
print('second subscription: ${event + event}');
});
// push events
streamController.sink.add(1);
streamController.sink.add(100);
}
Output :
first subscription: 1
second subscription: 2
first subscription: 100
second subscription: 200
Reference
https://medium.com/@NALSengineering/flutters-stream-in-a-nutshell-7918f2d9bf06
728x90
반응형