v2.0.0
This release aims to make it easier to implement custom Cancellables and provide more useful information for debugging.
- Added a
.cancelWithReason()method toCancellationTokenfor a convenient way to set provide a cancellation reason for debugging. CancelledExceptionnow overrides.toString()to give a more useful message for debugging, including the cancellation reason.- Cancellation stack traces now show the call stack leading up to the operation that was cancelled, rather than the call stack leading up to the token's cancellation. This should make it easier to identify the origin of uncaught cancellation exceptions.
- Added a
.detach()method to theCancellablemixin. When paired with.maybeAttach(), this will detach your cancellable from the token. - Fixed a bug where the
ignoreCancellation()wouldn't callwhenCompleteifonErrorthrew an exception. - Fixed a bug where
asCancellable()could result in uncaught exceptions.
Breaking changes
These changes are isolated to projects using custom cancellables or cancellation tokens. Other projects are unaffected.
- The
CancellationToken.attach()and.detach()methods have been renamed to.attachCancellable()and.detachCancellable(). - The
CancellationToken.exceptiongetter now returns null if the token hasn't been cancelled yet. - The
CancellationToken.cancel()method'sexceptionparameter is now nullable, rather than using a default value. - Removed the
[StackTrace? stackTrace]parameter from theCancellablemixin'sonCancelmethod. Instead, use the newcancellationStackTrace, which returns the stack trace at the time the cancellable was created. - Overridden
Cancellablemixin methods must now call super.
To migrate your custom cancellation tokens:
- If you're overriding the
.attach()and.detach()methods, rename them to.attachCancellable()and.detachCancellable(). - If you're overriding
.exception, update it to be nullable and only return an exception if the token's been cancelled. - If you're overriding
.cancel(), update it to make theexceptionparameter nullable. If you were previously setting a default value, consider setting this within the method instead:@override void cancel([Exception? exception]) { exception ??= YourCustomDefaultException(); super.cancel(exception); }
To migrate your custom cancellables:
- Replace calls to
cancellationToken.attach(this)withmaybeAttach(cancellationToken). - Replace calls to
cancellationToken.detach(this)withdetach(). - Update
onCancel()overrides to callsuper.onCancel()and remove thestackTraceparameter. To get the stack trace, usecancellationStackTraceinstead:// Old @override void onCancel(Exception cancelException, [StackTrace? stackTrace]) { _internalCompleter.completeError( cancelException, stackTrace ?? StackTrace.current, ); } // New @override void onCancel(Exception cancelException) { super.onCancel(cancelException); _internalCompleter.completeError(cancelException, cancellationStackTrace); }