rxdart 0.9.0

  • Readme
  • Changelog
  • Installing
  • --

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.

Usage #
var myObservable = new Observable(myStream);
Available Factory Methods #
  • amb
  • concat
  • defer
  • error
  • just
  • merge
  • never
  • periodic
  • retry
  • timer
Usage #
var myObservable = new Observable.merge([myFirstStream, mySecondStream]);
Available Static Methods #
  • combineLatest (combineLatest2, combineLatest3, combineLatest4, ..., combineLatest9)
  • range
  • tween
  • 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
  • sample
  • scan
  • skipUntil
  • startWith
  • startWithMany
  • takeUntil
  • timeInterval
  • timestamp
  • throttle
  • windowWithCount
  • withLatestFrom
  • zipWith
Usage #
var myObservable = new Observable(myStream)
    .bufferWithCount(5)
    .distinct();

Objects #

  • Observable
  • BehaviourSubject
  • ReplaySubject

Examples #

Web and command-line examples can be found in the example folder.

Web Examples #

In order to run the web examples, please follow these steps:

  1. Clone this repo and enter the directory
  2. Run pub get
  3. Run pub serve example/web
  4. Navigate to http://localhost:8080 in your browser

Command Line Examples #

In order to run the command line example, please follow these steps:

  1. Clone this repo and enter the directory
  2. Run pub get
  3. Run dart example/bin/fibonacci.dart 10

Flutter Example #

Install Flutter #

In order to run this repo, you must have Flutter installed. For help getting started with Flutter, view the online documentation.

Run the app #

  1. Open up an Android Emulator, the iOS Simulator, or connect an appropriate mobile device for debugging.
  2. Open up a terminal
  3. cd into the example/flutter/github_search directory
  4. Run flutter doctor to ensure you have all Flutter dependencies working.
  5. Run flutter packages get
  6. Run flutter run

Notable References #

Changelog #

Refer to the Changelog to get all release notes.

0.9.0 #

  • Api Changes:
    • Convert all StreamTransformer factories to proper classes
      • Ensure these classes can be re-used multiple times
    • Retry has moved from an operator to a constructor. This is to ensure the stream can be properly re-constructed every time in the correct way.
    • Streams now properly enforce the single-subscription contract
  • Include example Flutter app. To run it, please follow the instructions in the README.

0.8.3+1 #

  • rename examples map to example

0.8.3 #

  • added concatWith, zipWith, mergeWith, skipUntil
  • cleanup of the examples folder
  • cleanup of examples code
  • added fibonacci example
  • added search GitHub example

0.8.2+1 #

  • moved repo into ReactiveX
  • update readme badges accordingly

0.8.2 #

  • added materialize/dematerialize
  • added range (factory)
  • added timer (factory)
  • added timestamp
  • added concatMap

0.8.1 #

  • added never constructor
  • added error constructor
  • moved code coverage to codecov.io

0.8.0 #

  • BREAKING: tap is replaced by call(onData)
  • added call, which can take any combination of the following event methods: onCancel, onData, onDone, onError, onListen, onPause, onResume

0.7.1+1 #

  • improved the README file

0.7.1 #

  • added ignoreElements
  • added onErrorResumeNext
  • added onErrorReturn
  • added switchIfEmpty
  • added empty factory constructor

0.7.0 #

  • BREAKING: rename combineXXXLatest and zipXXX to a numbered equivalent, for example: combineThreeLatest becomes combineLatest3
  • internal refactoring, expose streams/stream transformers as a separate library

0.6.3+4 #

  • changed ofType to use TypeToken

0.6.3+3 #

  • added ofType

0.6.3+2 #

  • added defaultIfEmpty

0.6.3+1 #

  • changed concat, old concat is now concatEager, new concat behaves as expected

0.6.3 #

  • Added withLatestFrom
  • Added defer ctr (both thanks to brianegan)

0.6.2 #

  • Added just (thanks to brianegan)
  • Added groupBy
  • Added amb

0.6.1 #

  • Added concat

0.6.0 #

  • BREAKING: startWith now takes just one parameter instead of an Iterable. To add multiple starting events, please use startWithMany.
  • Added BehaviourSubject and ReplaySubject. These implement StreamController.
  • BehaviourSubject will notify the last added event upon listening.
  • ReplaySubject will notify all past events upon listening.
  • DEPRECATED: zip and combineLatest, use their strong-type-friendly alternatives instead (available as static methods on the Observable class, i.e. Observable.combineThreeLatest, Observable.zipFour, ...)

0.5.1 #

  • Added documentation (thanks to dustinlessard-wf)
  • Fix tests breaking due to deprecation of expectAsync
  • Fix tests to satisfy strong mode requirements

0.5.0 #

  • As of this version, rxdart depends on SDK v1.21.0, to support the newly added generic method type syntax

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:


dependencies:
  rxdart: ^0.9.0

2. Install it

You can install packages from the command line:

with pub:


$ pub get

Alternatively, your editor might support pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:


import 'package:rxdart/rxdart.dart';
  
Awaiting analysis to complete.