2023. 1. 3. 22:36ㆍIT/Flutter
RxDart는 Dart의 Stream 과 StreamController의 기능을 확장한다.
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 |
'IT > Flutter' 카테고리의 다른 글
[Flutter] Vertical scroll tabbar 을 만들어보자 (0) | 2023.06.05 |
---|---|
[Flutter] Expandable bottom sheet dialog 를 직접 만들어보자 (0) | 2023.06.01 |
[Flutter] ios 빌드 시 Module "** *" not found 에러를 만날때 (0) | 2023.05.15 |
[Flutter] TDD 실습해보기 - 1 (0) | 2023.01.03 |
[Flutter] StatefulWidget Lifecycle (0) | 2023.01.03 |