프로그래밍/Flutter & Dart

[Flutter] Stream Controller

*%$@$#@ 2023. 1. 13. 14:36
728x90
반응형

 

1. Stream Controller 

StreamController는 스트림을 제어하는 도구 중 하나입니다. 

각각의 StreamController는 'sink'와 'stream'이라는 두 개의 오브젝트를 갖습니다. 

sink는 스트림에 데이터를 넣어주는(push) 역할을 하며, stream은 데이터 파이프를 타고 넘어오는 데이터를 꺼내는(receive)데 사용합니다. 

https://medium.com/@NALSengineering/flutters-stream-in-a-nutshell-7918f2d9bf06

 

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
반응형