import 'dart:async'; import 'async_typeof.dart'; class CancelableFuture implements Future { final Completer _completer = Completer(); Cancelable? cancelable; CancelableFuture(FutureCompleter completer, this.cancelable) { completer.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( FutureCompleter completer, Cancelable? cancelable) { return CancelableFuture(completer, cancelable); } }