Sobes.tech
Back to questions
Junior — Middle
155

Какими способами можно отменить выполнение задачи, ассоциированной с Future?

Companies where asked
ICL

Answer from AI

sobes.tech AI

В Dart (и Flutter) объект Future сам по себе не поддерживает прямую отмену выполнения задачи. Однако есть несколько подходов для отмены:

  1. Использование флага отмены — внутри асинхронной функции проверять специальный флаг и прерывать выполнение.

  2. Использование CancelableOperation из пакета async — оборачивает Future и позволяет вызвать метод cancel().

  3. Использование Stream вместо Future — потоки можно закрывать и таким образом прерывать обработку.

  4. Отмена на уровне источника задачи — например, если Future связан с HTTP-запросом, можно отменить запрос через контроллер (например, CancelToken в Dio).

Пример с CancelableOperation:

import 'package:async/async.dart';

void main() async {
  var cancelable = CancelableOperation.fromFuture(
    Future.delayed(Duration(seconds: 5), () => 'Done'),
  );

  // Отмена через 2 секунды
  Future.delayed(Duration(seconds: 2), () {
    cancelable.cancel();
    print('Cancelled');
  });

  try {
    var result = await cancelable.value;
    print(result);
  } catch (e) {
    print('Operation was cancelled');
  }
}