- Breaking: as of this release, we've refactored the way Stream transformers are set up.
Previous releases had some incorrect behavior when using certain operators, for example:
-
startWith (startWithMany, startWithError) would incorrectly replay the starting event(s) when using a broadcast Stream at subscription time.
-
doOnX was not always producing the expected results:
- doOnData did not output correct sequences on streams that were transformed multiple times in sequence.
- doOnCancel now acts in the same manner onCancel works on regular subscriptions, i.e. it will now be called when all active subscriptions on a Stream are cancelled.
- doOnListen will now call the first time the Stream is subscribed to, and will only call again after all subscribers have cancelled, before a new subscription starts.
To properly fix this up, a new way of transforming Streams was introduced.
Operators as of now use Stream.eventTransformed and we've refactored all operators to implement Sink instead.
-
- Adds takeWileInclusive operator (thanks to @hoc081098)
We encourage everyone to give the dev release(s) a spin and report back if anything breaks. If needed, a guide will be written to help migrate from the old behavior to the new behavior in certain common use cases.
Keep in mind that we tend to stick as close as we can to how normal Dart Streams work!
- Fix API doc links in README
- Extension Methods replace
Observable
class! - Please upgrade existing code by using the rxdart_codemod package
- Remove the Observable class. With extensions, you no longer need to wrap Streams in a [Stream]!
- Convert all factories to static constructors to aid in discoverability of Stream classes
- Move all factories to an
Rx
class. - Remove
Observable.just
, useStream.value
- Remove
Observable.error
, useStream.error
- Remove all tests that check base Stream methods
- Subjects and *Observable classes extend Stream instead of base Observable
- Rename *Observable to *Stream to reflect the fact they're just Streams.
ValueObservable
->ValueStream
ReplayObservable
->ReplayStream
ConnectableObservable
->ConnectableStream
ValueConnectableObservable
->ValueConnectableStream
ReplayConnectableObservable
->ReplayConnectableStream
- All transformation methods removed from Observable class
- Transformation methods are now Extensions of the Stream class
- Any Stream can make use of the transformation methods provided by RxDart
- Observable class remains in place with factory methods to create different types of Streams
- Removed deprecated
ofType
method, usewhereType
instead - Deprecated
concatMap
, use standard StreamasyncExpand
. - Removed
AsObservableFuture
,MinFuture
,MaxFuture
, andWrappedFuture
- This removes
asObservable
method in chains - Use default
asStream
method from the baseFuture
class instead. min
andmax
now implemented directly on the Stream class
- This removes
- Fix missing exports:
ValueStream
ReplayStream
ConnectableStream
ValueConnectableStream
ReplayConnectableStream
- Remove the Observable class. With extensions, you no longer need to wrap Streams in a [Stream]!
- Convert all factories to static constructors to aid in discoverability of Stream classes
- Move all factories to an
Rx
class. - Remove
Observable.just
, useStream.value
- Remove
Observable.error
, useStream.error
- Remove all tests that check base Stream methods
- Subjects and *Observable classes extend Stream instead of base Observable
- Rename *Observable to *Stream to reflect the fact they're just Streams.
ValueObservable
->ValueStream
ReplayObservable
->ReplayStream
ConnectableObservable
->ConnectableStream
ValueConnectableObservable
->ValueConnectableStream
ReplayConnectableObservable
->ReplayConnectableStream
- Feedback on this change appreciated as this is a dev release before 0.23.0 stable!
- All transformation methods removed from Observable class
- Transformation methods are now Extensions of the Stream class
- Any Stream can make use of the transformation methods provided by RxDart
- Observable class remains in place with factory methods to create different types of Streams
- Removed deprecated
ofType
method, usewhereType
instead - Deprecated
concatMap
, use standard StreamasyncExpand
. - Removed
AsObservableFuture
,MinFuture
,MaxFuture
, andWrappedFuture
- This removes
asObservable
method in chains - Use default
asStream
method from the baseFuture
class instead. min
andmax
now implemented directly on the Stream class
- This removes
- Bugfix: When listening multiple times to a
BehaviorSubject
that starts with an Error, it emits duplicate events. - Linter: public_member_api_docs is now used, we have added extra documentation where required.
- Bugfix: DeferStream created Stream too early
- Bugfix: TimerStream created Timer too early
- Bugfix: switchMap controller no longer closes prematurely
- Bugfix: whereType failing in Flutter production builds only
- Bugfix: When using a seeded
BehaviorSubject
and adding anError
, upon listening, theBehaviorSubject
emitsnull
instead of the lastError
. - Bugfix: calling cancel after a
switchMap
can cause aNoSuchMethodError
. - Updated Flutter example to match the latest Flutter release
Observable.withLatestFrom
is now expanded to accept 2 or moreStream
s thanks to Petrus Nguyễn Thái Học (@hoc081098)!- Deprecates
ofType
in favor ofwhereType
, dropTypeToken
.
Fixes following issues:
- Erroneous behavior with scan and
BehaviorSubject
. - Bug where
flatMap
would cancel inner subscriptions inpause
/resume
. - Updates to make the current "pedantic" analyzer happy.
This version includes refactoring for the backpressure operators:
- Breaking Change:
debounce
is now split intodebounce
anddebounceTime
. - Breaking Change:
sample
is now split intosample
andsampleTime
. - Breaking Change:
throttle
is now split intothrottle
andthrottleTime
.
- Breaking Change:
BehaviorSubject
now has a separate factory constructorseeded()
This allows you to seed this Subject with anull
value. - Breaking Change:
BehaviorSubject
will now emit anError
, if the last event was also anError
. Before, when anError
occurred before alisten
, the subscriber would not be notified of thatError
. To refactor, simply change all occurences ofBehaviorSubject(seedValue: value)
toBehaviorSubject.seeded(value)
- Added the
groupBy
operator - Bugix:
doOnCancel
: will now await the cancel result, if it is aFuture
. - Removed:
bufferWithCount
,windowWithCount
,tween
Please usebufferCount
andwindowCount
,tween
is removed, because it never was an official Rx spec. - Updated Flutter example to work with the latest Flutter stable.
- Breaking Change: bufferCount had buggy behavior when using
startBufferEvery
(wasskip
previously) If you were relying on bufferCount withskip
greater than 1 before, then you may have noticed erroneous behavior. - Breaking Change:
repeat
is no longer an operator which simply repeats the last emitted event n-times, instead this is now an Observable factory method which takes a StreamFactory and a count parameter. This will cause each repeat cycle to create a fresh Observable sequence. mapTo
is a new operator, which works just likemap
, but instead of taking a mapper Function, it takes a single value where each event is mapped to.- Bugfix: switchIfEmpty now correctly calls onDone
- combineLatest and zip can now take any amount of Streams:
- combineLatest2-9 & zip2-9 functionality unchanged, but now use a new path for construction.
- adds combineLatest and zipLatest which allows you to pass through an Iterable<Stream> and a combiner that takes a List when any source emits a change.
- adds combineLatestList / zipList which allows you to take in an Iterable<Stream> and emit a Observable<List> with the values. Just a convenience factory if all you want is the list!
- Constructors are provided by the Stream implementation directly
- Bugfix: Subjects that are transformed will now correctly return a new Observable where isBroadcast is true (was false before)
- Remove deprecated operators which were replaced long ago:
bufferWithCount
,windowWithCount
,amb
,flatMapLatest
- Breaking Change: Subjects
onCancel
function now returnsvoid
instead ofFuture
to properly comply with theStreamController
signature. - Bugfix: FlatMap operator properly calls onDone for all cases
- Connectable Observable: An observable that can be listened to multiple times, and does not begin emitting values until the
connect
method is called - ValueObservable: A new interface that allows you to get the latest value emitted by an Observable.
- Implemented by BehaviorSubject
- Convert normal observables into ValueObservables via
publishValue
orshareValue
- ReplayObservable: A new interface that allows you to get the values emitted by an Observable.
- Implemented by ReplaySubject
- Convert normal observables into ReplayObservables via
publishReplay
orshareReplay
- Add
retryWhen
operator. Thanks to Razvan Lung (@long1eu)! This can be used for custom retry logic.
- Breaking Change: remove
retype
method, deprecated as part of Dart 2. - Add
flatMapIterable
- Breaking Change:
stream
property on Observable is now private.- Avoids API confusion
- Simplifies Subject implementation
- Require folks who are overriding the
stream
property to use asuper
constructor instead
- Adds proper onPause and onResume handling for
amb
/race
,combineLatest
,concat
,concat_eager
,merge
andzip
- Add
switchLatest
operator - Add errors and stacktraces to RetryError class
- Add
onErrorResume
andonErrorRetryWith
operators. These allow folks to return a specific stream or value depending on the error that occurred.
- Fix new buffer and window implementation for Flutter + Dart 2
- Subject now implements the Observable interface
- Rework for
buffer
andwindow
, allow to schedule using a sampler - added
buffer
- added
bufferFuture
- added
bufferTest
- added
bufferTime
- added
bufferWhen
- added
window
- added
windowFuture
- added
windowTest
- added
windowTime
- added
windowWhen
- added
onCount
sampler forbuffer
andwindow
- added
onFuture
sampler forbuffer
andwindow
- added
onTest
sampler forbuffer
andwindow
- added
onTime
sampler forbuffer
andwindow
- added
onStream
sampler forbuffer
andwindow
- Renames
amb
torace
- Renames
flatMapLatest
toswitchMap
- Renames
bufferWithCount
tobufferCount
- Renames
windowWithCount
towindowCount
- Adds
bufferTime
transformer. - Adds
windowTime
transformer.
- Adds
delay
transformer.
- Fix added events to
sink
are not processed correctly bySubjects
.
- Fix
dematerialize
method for Dart 2.
- Add
value
toBehaviorSubject
. Allows you to get the latest value emitted by the subject if it exists. - Add
values
toReplayrSubject
. Allows you to get the values stored by the subject if any exists.
- Update Changelog
- breaks backwards compatibility, this release only works with Dart SDK >=2.0.0.
- Removed old
cast
in favour of the now native Stream cast method. - Override
retype
to return anObservable
.
- Add
exhaustMap
map to inner observable, ignore other values until that observable completes. - Improved code to be dartdevc compatible.
- Add upper SDK version limit in pubspec
- Change
debounce
to emit the last item of the source stream as soon as the source stream completes. - Ensure
debounce
does not keep open any addition async timers after it has been cancelled.
- Change
DoStreamTransformer
to return aFuture
on cancel for api compatibility.
- Add
PublishSubject
(thanks to @pauldemarco) - Fix bug with
doOnX
operators where callbacks were fired too often
- Fix error with FlatMapLatest where it was not properly cancelled in some scenarios
- Remove additional async methods on Stream handlers unless they're shown to solve a problem
- Remove
call
operator /StreamTransformer
entirely - Important bug fix: Errors thrown within any Stream or Operator will now be properly sent to the
StreamSubscription
. - Improve overall handling of errors throughout the library to ensure they're handled correctly
- Added doOn* operators in place of
call
. - Added
DoStreamTransformer
as a replacement forCallStreamTransformer
- Deprecated
call
andCallStreamTransformer
. Please use the appropriatedoOnX
operator / transformer. - Added
distinctUnique
. Emits items if they've never been emitted before. Same as to Rx#distinct.
- !!!Breaking Api Change!!!
- Observable.groupBy has been removed in order to be compatible with the next version of the
Stream
class in Dart 1.24.0, which includes this method
- Observable.groupBy has been removed in order to be compatible with the next version of the
- BugFix: The new Subject implementation no longer causes infinite loops when used with ng2 async pipes.
- Documentation fixes
- Api Changes
- Observable
- Remove all deprecated methods, including:
observable
factory -- replaced by the constructornew Observable()
combineLatest
-- replaced by Strong-Mode versionscombineLatest2
-combineLatest9
zip
-- replaced by Strong-Mode versionszip2
-zip9
- Support
asObservable
conversion from Future-returning methods. e.g.new Observable.fromIterable([1, 2]).first.asObservable()
- Max and Min now return a Future of the Max or Min value, rather than a stream of increasing or decreasing values.
- Add
cast
operator - Remove
ConcatMapStreamTransformer
-- functionality is already supported byasyncExpand
. Keep theconcatMap
method as an alias.
- Remove all deprecated methods, including:
- Subjects
- BehaviourSubject has been renamed to BehaviorSubject
- The subjects have been rewritten and include far more testing
- In keeping with the Rx idea of Subjects, they are broadcast-only
- Observable
- Documentation -- extensive documentation has been added to the library with explanations and examples for each Future, Stream & Transformer.
- Docs detailing the differences between RxDart and raw Observables.
- 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
- Convert all StreamTransformer factories to proper classes
- Include example Flutter app. To run it, please follow the instructions in the README.
- rename examples map to example
- added concatWith, zipWith, mergeWith, skipUntil
- cleanup of the examples folder
- cleanup of examples code
- added fibonacci example
- added search GitHub example
- moved repo into ReactiveX
- update readme badges accordingly
- added materialize/dematerialize
- added range (factory)
- added timer (factory)
- added timestamp
- added concatMap
- added never constructor
- added error constructor
- moved code coverage to codecov.io
- 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
- improved the README file
- added ignoreElements
- added onErrorResumeNext
- added onErrorReturn
- added switchIfEmpty
- added empty factory constructor
- BREAKING: rename combineXXXLatest and zipXXX to a numbered equivalent, for example: combineThreeLatest becomes combineLatest3
- internal refactoring, expose streams/stream transformers as a separate library
- changed ofType to use TypeToken
- added ofType
- added defaultIfEmpty
- changed concat, old concat is now concatEager, new concat behaves as expected
- Added withLatestFrom
- Added defer ctr (both thanks to brianegan)
- Added just (thanks to brianegan)
- Added groupBy
- Added amb
- Added concat
- 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, ...)
- Added documentation (thanks to dustinlessard-wf)
- Fix tests breaking due to deprecation of expectAsync
- Fix tests to satisfy strong mode requirements
- As of this version, rxdart depends on SDK v1.21.0, to support the newly added generic method type syntax