void main() async {
CancelableTask<String> cancelableTask = CancelableTask();
cancelableTask.startTask(operater()).then((value) {
print("yyyyy:$value");
}).catchError((e) {
print('xxxxx e $e');
});
}
Future<String> operater() async {
await Future.delayed(Duration(seconds: 6)).timeout(Duration(seconds: 4));
print('over');
return 'operater';
}
class CancelableTask<T> {
Completer<T>? _completer;
final timeout = 30;
Future<T> startTask(Future<T> future) {
_completer = Completer();
future.then((value) {
print("then");
if (!(_completer?.isCompleted ?? true)) {
_completer?.complete(value);
}
}).catchError((e, s) {
print("catchError");
if (!(_completer?.isCompleted ?? true)) {
_completer?.completeError(e ?? 'error');
}
}).timeout(Duration(seconds: timeout), onTimeout: () {
print("timeout");
if (!(_completer?.isCompleted ?? true)) {
_completer?.completeError('timeout');
}
});
return _completer!.future;
}
void cancelTask() {
if (!(_completer?.isCompleted ?? true)) {
_completer?.completeError('cancel');
}
_completer = null;
}
}