Sobes.tech
Junior — Middle

É possível interromper a execução de uma tarefa devolvida através de Future e como fazer isso?

sobes.tech IA

Resposta da IA

Em Dart (e, consequentemente, no Flutter) não é possível interromper diretamente uma tarefa devolvida por um Future, pois o Future não suporta cancelamento. No entanto, pode-se implementar um cancelamento indireto usando flags ou controladores que são verificados dentro da operação assíncrona.

Por exemplo, pode-se usar Completer e verificar o estado de cancelamento:

class CancellableOperation {
  bool _isCancelled = false;

  Future<String> run() async {
    for (int i = 0; i < 10; i++) {
      if (_isCancelled) {
        throw Exception('Operação cancelada');
      }
      await Future.delayed(Duration(seconds: 1));
    }
    return 'Pronto';
  }

  void cancel() {
    _isCancelled = true;
  }
}

void main() async {
  final operation = CancellableOperation();
  final future = operation.run();

  // Cancelar após 3 segundos
  Future.delayed(Duration(seconds: 3), () {
    operation.cancel();
  });

  try {
    final result = await future;
    print(result);
  } catch (e) {
    print(e); // Operação cancelada
  }
}

Para casos mais complexos, pode-se usar pacotes como async com CancelableOperation.

Dessa forma, a cancelamento direto do Future não é possível, mas é possível implementar a lógica de cancelamento dentro da própria tarefa.