250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Flutter #Stream
- 희망적금연계
- 도약연계
- 희망적금전환
- Flutter #Stream #dart
- 조립 후 재부팅
- flutter #dart #stream
- 안드로이드 #코틀린 #코루틴 #콜백 #채널
- 도약전환
- 플러터 #안드로이드 #플레이콘솔 #앱내리기
- 청년도약계좌환승
- 도약계좌전환
Archives
- Today
- Total
Flutter 개발 상자
[Flutter Stream④] StreamController 활용 본문
728x90
StreamController
개념
일단 위의 그림을 보면 중간에서 Stream과 구독자의 중재역할을 해주는것으로 보인다.
StreamController는 새로운 개념이 아니라 단순히 스트림을 제어하는데 도움을 주는 도구라고 생각하면된다.
기본 사용법
void main() async {
final StreamController streamController = StreamController();
streamController.stream.listen(print);
streamController.add('이벤트 발생');
streamController.sink.add('1 2 3 4 5');
streamController.addStream(Stream.periodic(const Duration(milliseconds: 100), (count) => count + 1,).take(5));
await Future.delayed(const Duration(milliseconds: 500));
streamController.close();
// Bad state: Cannot add event after closing 에러 발생
streamController.add('추가 이벤트 발생'); // 에러로 출력되지 않음.
}
add혹은 addStream을 통해 요소들을 추가한다. close로 controller를 닫은 후에 추가하면 에러가 발생한다.
sink.add와 add는 동일한 동작 이다. sink.addStream도 마찬가지.
GPT의 말에 따르면 .add메서드는 .sink.add의 래퍼 역할을 담당하여 좀 더 간편한 문법을 제공해준다고한다.
기본 메서드
void main() async {
final StreamController streamController = StreamController();
streamController.add('이벤트');
print(streamController.isClosed); // false
print(streamController.isPaused); // true
print(streamController.hasListener); // false
streamController.done.then((_) => print('스트림 완료')); // close()가 호출된 이후에 실행됨
streamController.sink; // Stream sink를 반환
}
다행히(?) 그렇게 메서드가 많진 않다.
T/F 를 반환하는 메서드는 이름 그대로의 역할을 하고
done의 경우 close()가 호출된 이후에 Future가 완료되고 sink는 위에서 봤듯이 굳이 사용하지 않아도 sink안의 메서드를 사용할 수 있으니 크게 쓸일은 없어보인다.
broadcast
개념
StreamController는 broadcast() 라는 팩토리 생성자를 가지고 있다.
이를 통해 생성하면 여러개의 리스너(구독자)가 동일한 스트림을 동시에 수신할 수 있게 된다.
일반 생성자로 생성된 컨트롤러를 중간에 broadcast 컨트롤러로 전환하는건 불가능하다.
기본 사용법
void main() async {
final StreamController<String> controller = StreamController.broadcast();
final StreamSubscription<String> subscription1 = controller.stream.listen((event) {
print('1번구독자 : $event');
});
final StreamSubscription<String> subscription2 = controller.stream.listen((event) {
print('2번구독자 : $event');
});
controller.add('이벤트 시작');
controller.add('구독자님 안녕하세요.');
// 출력
// 1번구독자 : 이벤트 시작
// 2번구독자 : 이벤트 시작
// 1번구독자 : 구독자님 안녕하세요.
// 2번구독자 : 구독자님 안녕하세요.
}
직접 사용해보니 어려운 개념은 아니다.
그냥 여러 리스너들이 동시에 이벤트를 수신하고 있다.
요약
- StreamController는 Stream을 제어하는 도구
- broadcast() 팩토리 생성자를 통해서 여러개의 리스너를 가질 수 있다.
728x90
'Flutter' 카테고리의 다른 글
[Flutter] Riverpod의 Provider(Notifier) 영역에서 context나 TextEditingController를 써도 되는가? (2) | 2024.01.01 |
---|---|
[Flutter] Talker 패키지를 이용하여 로그(Log)를 파일로 저장하기 (0) | 2023.12.21 |
[Flutter Stream③] StreamSubscription 활용 (0) | 2023.11.12 |
[Flutter Stream②] Stream 기본 사용법 (1) | 2023.11.12 |
[Flutter Stream①] Rective Programing과 Stream (2) | 2023.11.11 |