import 'dart:async'; import 'dart:ui'; import 'package:fl_clash/common/common.dart'; extension FutureExt on Future { Future withTimeout({ Duration? timeout, String? tag, VoidCallback? onLast, FutureOr Function()? onTimeout, }) { final realTimeout = timeout ?? const Duration(minutes: 3); Timer(realTimeout + commonDuration, () { if (onLast != null) { onLast(); } }); return this.timeout( realTimeout, onTimeout: () async { if (onTimeout != null) { return onTimeout(); } else { throw TimeoutException('${tag ?? runtimeType} timeout'); } }, ); } } extension CompleterExt on Completer { void safeCompleter(T value) { if (isCompleted) { return; } complete(value); } }