파파비의 블로그
Flutter) "Rxdart" - 스트림을 더 쉽게, 유용하게 본문
1) 스트림이란?
- 큰 Data를 잘게 나누어서 한번에 다 다운받지 않고도 data를 받아서 사용이 가능하다.
- 유튜브 영상이나 동영상 강의 같은 것들을 생각하면 된다.
2) 플러터에도 Stream이 사용되는데, 약간 결이 다른 것 같다. (다운로드 같은건 아니니까..)
- 먼저 스트림은 data가 날라오면 구독자들에게 알리는 역할을 한다. 알리면서 당연히 해당 data도 전달한다.
- SteamController 라는 객체를 만들면, Stream이 형성되고, 이 Stream을 통제할 수 있는 Controller도 같이 나온다.
- (SteamController 객체를 stream이라고 부르겠다) stream.listen하고 인수로 함수를 넣으면, steam을 통해 어떤 data가 전달되었을 때, 바로 그 메소드가 실행된다. 해당 메소드에는 인수로 stream에서 얻은 data를 controll할 수 있다.
3) dart에서 제공되는 StreamController 객체와 & StreamController.broadcast 객체
- 이둘은 dart에서 제공하는데 차이점이 있다. StreamController는 listen(리스너)를 한번만 설정할 수 있다.
즉 리스너를 하나만 달 수 있다.
- StreamController.broadcast는 리스너를 여러개 달아도 상관 없다.
4) 그렇다면 스트림을 통해 data를 어떻게 전달할까?
stream.stream.add()를 통해 가능하다. add뒤에 인수로 data가 들어간다. 그리고 앞의 stream은 StreamController 의 객체이름이고, 뒤에는 진짜 stream을 의미한다.
5) RxDart는 무엇인가? 이런 Stream에 관한 것들을 더 쉽게 다루게 하기 위해, 추가적인 method들과 함께 제공해주는 패키지, 플러그인이라고 할 수 있다.
6) RxDart에는 3가지 stream객체가 존재한다.
- PublishSubject<T> 객체, BehaviorSubject<T> 객체, ReplaySubject<T> 객체
- T는 전달하려는, stream되는 data의 타입을 의미한다.
- 이들은 기본적으로 StreamController.broadcast 객체들이다. 따라서 여러개의 리스너를 담을 수 있다.
- 이들의 차이점은
1) PublishSubject은 리스너를 추가하면 해당 리스너는 그 이후의 stream data에 대해서만 반응한다.
2) BehaviorSubject는 추가되기 직전 하나의 data를 포함하여 그 이후의 stream data에 대해 반응한다.
3) ReplaySubject는 맨 처음 data부터 전부 다 반응한다.
반응한다는 것은 listen에 넣어진 함수가 실행된다는 뜻이다.
(리스너가 반응하는 것이다).
7) RxDart에는 유용한 메소드가 있다. map이다.
event에 대해서 (event는 받은 data를 의미한다.) 변형을 바로 할 수 있다.
또한 이 map함수는 chain이 가능해서 map을 여러번 통해서 가공을 정교하게 할 수 있다.
subject는 streamcontroller 객체인데, listen하기 전에 event를 가공하는 모습이다.
이렇게 한다.
추가적으로 where, scan 등이 있다.
- where은 true가 return되면 listen하고, 그렇지 않으면 listen하지 않는다.
- scan은 이전 값을 활용할 수 있다
여기서 예시에서는 들어온 값들의 합을 나타내고 있다.
- asyncMap도 있는데 이건 그냥 map과 똑같은데, 비동기형식으로 지원되며, async작업들을 처리할 수도 있다.
- debounceTime 도 있는데 여기에는 인수로 시간이 들어가고, 이 시간 이후부터 data를 받게된다. 따라서 그 전에 들어오는 data들은 전부 무시된다.(리스너가 반응X)
- buffercount로 버퍼를 설정할 수도 있는데 2라고 설정하면 한번에 2개의 data가 날라온다.
- distinctUnique 는 동일한값이 연속해서 오면 하나의 값만 보여주고 중복되는 값은 무시한다.
그 이외에도 사용할 수 있는 method들은 너무나도 많다.
잘 알아보면 웬만한 것들은 다 있을 것이다.
사실 stream객체가 더 있는데 이것들은 좀 특이하다.
RangeStream, TimeStream같은게 있는데,
Range의 경우 범위 값을 넣으면 그냥 그게 그 자리에서 add되는 것이다.
TimeStream은 일정 시간 이후에 add가 된다.
사용은 안해봐서 정확히는 모르지만,
나중에 혹시 필요하면 그때 자세히 알아보자
8) flutter에서 future들은 stream으로 바꿀 수 있다.
asStream 메소드를 사용하면 된다.
9) mergewith / zipwith / concatewith 등을 활용하면 여러개의 stream을 하나의 stream으로 합쳐서 관리할 수 있다.
여기는 rx에 대해서 그래프로 이해할 수 있는 곳이다. 참고바람
'개발 > flutter' 카테고리의 다른 글
[Flutter, 플러터] Unit Test에 대해 (Unit Test 작성법 / 좋은 Unit Test란? / Group) (0) | 2021.10.05 |
---|---|
Flutter, 플러터) Firebase auth 이용 / 이메일 인증 진행하기 (0) | 2020.10.01 |
플랫폼과 대화하는 방법 Method Channel / Event Channel (0) | 2020.07.31 |
앱에 admob 광고 달기 (안드로이드) (0) | 2020.07.19 |
플러터, flutter) 앱 퍼블리싱하기(앱이름 설정, 아이콘, 스플래시이미지, 앱 빌드) (0) | 2020.06.24 |