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
'Dart & Flutter' 카테고리의 다른 글
[Flutter] BuildContext 이해하기 (0) | 2023.02.24 |
---|---|
[Flutter] context watch, read, select의 차이 (0) | 2023.02.23 |
[Flutter] 빈 공간을 tap했을 때 textfield focus 해제 (0) | 2023.02.16 |
[Dart] ValueChanged (0) | 2023.02.16 |
[Flutter] Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<String>?' in type cast (0) | 2023.02.15 |