rxdart 0.8.3+1

[outdated]

Native Dart rx implementation

RxDart #

Build Status codecov Pub Gitter

About #

RxDart is a reactive functional programming library for Google Dart, based on ReactiveX.
Google Dart comes with a very decent Streams API out-of-the-box; rather than attempting to provide an alternative to this API, RxDart adds functionality on top of it.

How To Use RxDart #

For Example: Reading the Konami Code #

void main() {
  const konamiKeyCodes = const <int>[
    KeyCode.UP,
    KeyCode.UP,
    KeyCode.DOWN,
    KeyCode.DOWN,
    KeyCode.LEFT,
    KeyCode.RIGHT,
    KeyCode.LEFT,
    KeyCode.RIGHT,
    KeyCode.B,
    KeyCode.A];

  final result = querySelector('#result');
  final keyUp = new Observable<KeyboardEvent>(document.onKeyUp);

  keyUp
    .map((event) => event.keyCode)
    .bufferWithCount(10, 1)
    .where((lastTenKeyCodes) => const IterableEquality<int>().equals(lastTenKeyCodes, konamiKeyCodes))
    .listen((_) => result.innerHtml = 'KONAMI!');
}

API Overview #

RxDart's Observables extend the Stream class. This has two major implications:

Instantiation #

Generally speaking, creating a new Observable is either done by wrapping a Dart Stream using the top-level constructor new Observable(), or by calling a factory method on the Observable class. But to better support Dart's strong mode, combineLatest and zip have been pulled apart into fixed-length constructors. These methods are supplied as static methods, since Dart's factory methods don't support generic types.

Available Top-level Method
  • observable
Usage
var myObservable = new Observable(myStream);
Available Factory Methods
  • amb
  • concat
  • defer
  • error
  • just
  • merge
  • never
  • periodic
  • range (static)
  • timer
  • tween (static)
Usage
var myObservable = new Observable.merge([myFirstStream, mySecondStream]);
Available Static Methods
  • combineLatest (combineLatest2, combineLatest3, combineLatest4, ..., combineLatest9)
  • zip (zip2, zip3, zip4, ..., zip9)
Usage
var myObservable = Observable.combineLatest3(
    myFirstStream, 
    mySecondStream, 
    myThirdStream, 
    (firstData, secondData, thirdData) => print("$firstData $secondData $thirdData"));

Transformations #

Available Methods
  • bufferWithCount
  • call
  • concatMap
  • concatWith
  • debounce
  • dematerialize
  • flatMapLatest
  • flatMap
  • groupBy
  • interval
  • materialize
  • mergeWith
  • max
  • min
  • pluck
  • repeat
  • retry
  • sample
  • scan
  • skipUntil
  • startWith
  • startWithMany
  • takeUntil
  • timeInterval
  • timestamp
  • throttle
  • windowWithCount
  • withLatestFrom
  • zipWith
Usage
var myObservable = observable(myStream)
    .bufferWithCount(5)
    .distinct();

Objects #

  • Observable
  • BehaviourSubject
  • ReplaySubject

Notable References #

Changelog #

Refer to the Changelog to get all release notes.