[Flutter] RxDart 공식문서 보기 - 1

2023. 1. 3. 22:36IT/Flutter

SMALL

RxDart는 Dart의 StreamStreamController의 기능을 확장한다.

 

Dart는 기본적으로 꽤 쓸만한 Stream API 를 제공하는데, RxDart는 이 Stream API에 대한 대안이 아니라 확장 사양의 기능을 제공한다.

 

RxDart는 Dart Stream을 대신하여 Observable 클래스를 제공하지 않는다. 대신에 몇가지 추가 Stream 클래스, 연산자 및 Subject를 제공한다.

 

API 개요

Stream Classes - 여러 스트림을 결합 또는 병합하는 등의 기능을 사용하여 스트림을 만든다.

Extension Methods - 원본 스트림을 throttling, buffering events 등의 다양한 기능을 가진 새 스트림으로 변환한다.

Subjects - 추가적인 기능을 가진 StreamController

 

Stream Classes

Stream Classes 는 스트림을 생성하기위한 다른 방법들을 제공한다. ex) Stream.fromIterable or Stream.periodic 등

RxDart는 추가적인 Stream Classes를 제공한다 combining or merging Streams 같은.

 

Stream은 두가지 방식으로 구현할 수 있다.

1. Stream class 를 직접 instantiate 하는 방법

ex) final mergedStream = MergeStream([firstStream, secondStream]);

2. Rx 클래스의 static factory method를 활용하는 방법

ex) final mergedStream = Rx.merge([firstStream, secondStream]);

 

Extension Methods

RxDart에서 제공하는 Extension Methods는 어떠한 Stream에도 적용될 수 있다. 예를들어 원본 스트림에 새로운 기능을 추가하여 새 스트림으로 변환할 수 있다.

Stream.fromIterable([1, 2, 3])
  .throttleTime(Duration(seconds: 1))
  .listen(print); // prints 3

 

Subjects

Dart는 Stream을 관리하고 생성하기위해 StreamController 클래스를 제공하는데, RxDart는 두가지 추가적인 기능을 가진 StreamController을 제공한다. 이것들이 바로 Subject다.

 

BehaviorSubject - Broadcast 스트림으로서 마지막에 추가된 값이나 에러를 캐싱한다. 새로운 구독자가 해당 스트림에 구독을 할때, 마지막 값이나 에러가 emit 된다. 게다가 동기적으로 해당 값 또는 에러를 읽을 수 있다.

Example

final subject = BehaviorSubject<int>();

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

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

Example with seed value

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

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

마지막에 추가된 값만 emit되어 출력되는것을 확인할 수 있다.

 

ReplaySubject - Broadcast 스트림으로서 추가된 값들을 캐싱한다. 새로운 구독자가 해당 스트림에 구독을 할때, 캐싱된 값이 emit 된다.

Example

final subject = ReplaySubject<int>();

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

subject.stream.listen(print); // prints 1, 2, 3
subject.stream.listen(print); // prints 1, 2, 3
subject.stream.listen(print); // prints 1, 2, 3

Example with maxSize

final subject = ReplaySubject<int>(maxSize: 2);

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

subject.stream.listen(print); // prints 2, 3
subject.stream.listen(print); // prints 2, 3
subject.stream.listen(print); // prints 2, 3

추가된 모든 값이 emit되어 출력되는것을 확인할 수 있다.

 

Rx Observables vs Dart Streams 

Additional information about the following situations can be found by reading the Rx class documentation.

SituationRx ObservablesDart Streams

An error is raised Observable Terminates with Error Error is emitted and Stream continues
Cold Observables Multiple subscribers can listen to the same cold Observable, and each subscription will receive a unique Stream of data Single subscriber only
Hot Observables Yes Yes, known as Broadcast Streams
Is {Publish, Behavior, Replay}Subject hot? Yes Yes
Single/Maybe/Completable ? Yes Yes, uses rxdart_ext Single (Completable = Single<void>, Maybe<T> = Single<T?>)
Support back pressure Yes Yes
Can emit null? Yes, except RxJava Yes
Sync by default Yes No
Can pause/resume a subscription*? No Yes
LIST