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
반응형
'프로그래밍 > Flutter & Dart' 카테고리의 다른 글
[Flutter] Inherited Widget (0) | 2023.02.01 |
---|---|
[Flutter] for와 forEach (0) | 2023.01.05 |
[Flutter] Cascade Operator (0) | 2023.01.05 |
[Flutter] Future Builder (1) | 2023.01.05 |
[Flutter] 보이지 않는 위젯(layout widget) (0) | 2022.12.31 |
댓글