Voltar ao código Dart

Una llamada de red con tiempo límite y reintentos

Una función genérica que envuelve cualquier Future: corta si tarda demasiado y reintenta un número fijo de veces.

Este post ainda não está no seu idioma; você o vê em espanhol. O código é o mesmo.

O problema

En una app móvil la red se cae y vuelve. Una llamada sin tiempo límite deja la pantalla girando para siempre; una sin reintento convierte un túnel en un error.

Dart
import 'dart:async';

Future<T> conReintento<T>(Future<T> Function() tarea, {int intentos = 3, Duration limite = const Duration(seconds: 5)}) async {
  for (var i = 1; ; i++) {
    try {
      return await tarea().timeout(limite);
    } on TimeoutException {
      if (i >= intentos) rethrow;
      print('Intento $i: sin respuesta en ${limite.inSeconds}s, reintento');
    } catch (e) {
      if (i >= intentos) rethrow;
      print('Intento $i falló: $e');
    }
    await Future.delayed(Duration(milliseconds: 300 * i));
  }
}

Future<void> main() async {
  var llamadas = 0;
  final dato = await conReintento(() async {
    llamadas++;
    if (llamadas < 3) throw Exception('red caída');
    return 'perfil cargado';
  });
  print('$dato tras $llamadas intentos');
}

Por que está escrito assim

  1. timeout convierte una espera eterna en una TimeoutException a los cinco segundos.
  2. rethrow relanza el error original conservando su traza: quien llama ve la causa real.
  3. La pausa crece con cada intento (300, 600, 900 ms) para no insistir sobre una red que recién vuelve.
  4. Al ser genérica, sirve igual para un perfil, una lista o un archivo.
Como testar

Guardalo como reintento.dart y corré: dart run reintento.dart. También corre en dartpad.dev.

Atenção

timeout deja de esperar, pero no cancela la llamada: el pedido sigue vivo por debajo. Para cancelar de verdad hace falta que el cliente HTTP lo soporte.

Adapte ao seu caso com IA

O botão copia este prompt com o código colado abaixo. Substitua os colchetes pelo que é seu e cole no ChatGPT, Claude, Gemini ou Copilot.

O prompt
Tengo esta función de reintento con tiempo límite en Dart. Adaptala para usarla en Flutter con [PAQUETE HTTP: http, dio], que solo reintente errores de red y códigos 5xx (nunca 4xx), que cancele de verdad el pedido al vencer el tiempo y que exponga el estado para mostrar "reintentando…" en pantalla con [GESTOR DE ESTADO]. Mostrame el uso en un botón de recargar.

Exemplo escrito e revisado à mão.

Compartilhar

Comentários

Ainda não há comentários. O primeiro pode ser o seu.

Apenas texto, sem links. Não pedimos e-mail. Os comentários são revisados antes de serem publicados.

Adaptou para algo seu?

Me conte o que resolveu com isto, ou o que faltou.

Continue testando

Mais código

Ver todos
Darinel Ortega Online · respondo ao longo do dia
Hoje
Olá. Aqui eu não vendo nada: isto é para trocar conhecimento sobre tecnologia.
Escreva o que quiser — pode mandar texto, imagens ou documentos. As mensagens chegam ao meu console e eu respondo por lá.
Você está escrevendo fora do horário. Eu leio assim que o dia começar.

Conversa aberta para compartilhar conhecimento. As mensagens chegam ao meu console e eu respondo por lá.

Vamos marcar uma conversa

Escolha o dia e a hora que funcionem para você. Trinta minutos, sem discurso comercial.

Videochamada

Para uma videochamada, peça por aqui que eu te mando o link da sessão.