Dart & Flutter

[Dart] PublishSubject와 BehaviorSubject

ju_young 2023. 2. 19. 03:44
728x90

PublishSubject

final subject = PublishSubject<int>();

// receive all data and done events (1, 2, 3 모두 출력)
subject.stream.listen(print);
subject.add(1);
subject.add(2);

// only receive 3 and done event (3만 출력)
subject.stream.listen(print);
subject.add(3);

subject.close();

위 코드에서는 간단하게 listener를 print로 지정했으며 모든 값들을 출력해준다. 맨 처음에 지정한 listener기준으로 1, 2, 3을 보내면 차례대로 모두 출력해주고 중간에 지정한 listener는 이후에 3만 보냈으니 3만 출력해준다.

 

BehaviorSubject

final subject1 = BehaviorSubject<int>();

subject1.add(1);
subject1.add(2);
subject1.add(3);

subject1.stream.listen(print); // prints 3
subject1.stream.listen(print); // prints 3
subject1.stream.listen(print); // prints 3

final subject2 = BehaviorSubject<int>.seeded(1);

subject2.stream.listen(print); // prints 1
subject2.stream.listen(print); // prints 1
subject2.stream.listen(print); // prints 1

가장 마지막으로 보낸 값만 출력해준다. subject1에 1, 2, 3을 차례로 넣었지만 listener는 마지막 값 3만을 출력한다. subject2는 seeded value인 1만을 출력한다.

 

위 개념들을 모르고 List일 때 element를 추가하는 add와 헷갈린 적이 있었는데 한 번 간단히 짚고 넘어가 보자.

final subject = BehaviorSubject<List<int>>.seeded([]);

subject.add([1, 2, 3])
subject.add([4, 5, 6])

subject의 값은 [4, 5, 6] 이 될 것이다. 즉, PublishSubject 또는 BehaviorSubject의 add는 추가([1, 2, 3, 4, 5, 6])한다는 개념이 아닌 데이터 값을 밀어넣는 느낌([1, 2, 3] => [4, 5, 6])이다.

 

현재 subject의 값은 subject.value로 확인할 수 있다. List의 경우 [...subject.value] 으로 가져올 수도 있을 것이다. 공식문서에서는 value 속성을 사용하면 Returns the last emitted value, 마지막에 보낸 값을 반환해준다고 한다.

 

[Reference]

https://www.woolha.com/tutorials/rxdart-using-subject-publish-behavior-replay

https://pub.dev/documentation/rxdart/latest/rx/PublishSubject-class.html

https://pub.dev/documentation/rxdart/latest/rx/BehaviorSubject-class.html

728x90