Saltar al contenido

Flutter Future vs Completer

Solución:

Completer es una clase de ayuda para crear Future, mientras que Future es una Type.

Todas las funciones asincrónicas devuelven Future, pero con Completer es posible crear una función sincrónica que también devuelve Future. También puede encadenar las funciones de sincronización con then etc.

El objeto de finalización es un proceso unidireccional, no se puede reiniciar. Hace el trabajo y se detiene.

Future<MyObject> myMethod() {
  final completer = Completer();
  completer.complete(MyObject());
  return completer.future;
}

Actualizar:

Para dar un ejemplo, en uno de mis proyectos tuve que obtener la información de resolución de las imágenes de red. Para hacer eso, necesita algo como esto: https://stackoverflow.com/a/44683714/10380182

Allí, como puede ver, después de obtener la imagen, realizamos un proceso de resolución que puede llevar tiempo aunque no sea un proceso asíncrono. Para eliminar ese bloqueo simplemente usamos Completer.

Además, la información que necesitamos existe dentro de una devolución de llamada, por lo que será más limpio de usar Completer ahí. Luego, lo usamos a través de FutureBuilder. Puede acercarse de manera diferente, pero esta es una forma muy conveniente de manejar.

Prefiere el futuro sobre el finalizador

A Completer es una clase que se utiliza para crear un Future desde cero. Entonces, a menos que realmente esté creando un Future desde cero, probablemente no deberías usar un Completer.

Cómo hacer un futuro

Puede crear un futuro sin utilizar un Completer usando el Futureconstructor de:

final myFuture = Future(() {
  final result = doSomethingThatTakesTime();
  return result;
});

Utilizando Future.then() es otra forma de obtener un Future:

Future<bool> fileContainsBear(String path) {
  return File(path).readAsString().then((contents) {
    return contents.contains('bear');
  });
}

Y cualquiera async/await El método devuelve un futuro:

Future<bool> fileContainsBear(String path) async {
  var contents = await File(path).readAsString();
  return contents.contains('bear');
}

Los métodos anteriores se recomiendan todos sobre el uso de un Completer:

// This is harder to read.
Future<bool> fileContainsBear(String path) {
  var completer = Completer<bool>();

  File(path).readAsString().then((contents) {
    completer.complete(contents.contains('bear'));
  });

  return completer.future;
}

Cómo hacer un Completador

Pero si realmente necesita usar un Completer, la forma de hacerlo es así:

  1. Crear un nuevo Completer.
  2. Devuelve su future.
  3. Dígale al completador cuando esté completo o cuando haya un error.

Aquí hay un ejemplo:

class AsyncOperation {
  Completer _completer = new Completer();

  Future<T> doOperation() {
    _startOperation();
    return _completer.future; // Send future object back to client.
  }

  // Something calls this when the value is ready.
  void _finishOperation(T result) {
    _completer.complete(result);
  }

  // If something goes wrong, call this.
  void _errorHappened(error) {
    _completer.completeError(error);
  }
}

El código de esta respuesta proviene de la documentación y de la guía Effective Dart.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *