import 'dart:async'; import 'async_typeof.dart'; class CancelableFuture implements Future { final Completer _completer = Completer(); Cancelable? cancelable; CancelableFuture(this.cancelable, {FutureCompleter? futureCompleter}) { futureCompleter?.call(_completer); } void cancel() { cancelable?.call(); } @override Stream asStream() => _completer.future.asStream(); @override Future catchError(Function onError, {bool Function(Object error)? test}) => _completer.future.catchError(onError, test: test); @override Future then(FutureOr Function(T value) onValue, {Function? onError}) => _completer.future.then(onValue, onError: onError); @override Future timeout(Duration timeLimit, {FutureOr Function()? onTimeout}) => _completer.future.timeout(timeLimit, onTimeout: onTimeout); @override Future whenComplete(FutureOr Function() action) => _completer.future.whenComplete(action); } extension CancelableFutureExtension on Future { CancelableFuture asCancelable( Cancelable cancelable, { FutureCompleter? futureCompleter, }) { return CancelableFuture(cancelable, futureCompleter: futureCompleter); } }