web-dev-qa-db-fra.com

Dart, comment créer un futur pour revenir dans vos propres fonctions?

est-il possible de créer votre propre futur dans Dart pour revenir de vos méthodes, ou devez-vous toujours renvoyer un retour futur intégré à partir d'une des méthodes de bibliothèques asynchrones de Dart?

Je veux définir une fonction qui renvoie toujours un Future<List<Base>> qu'il s'agisse réellement d'un appel asynchrone (lecture de fichier/ajax/etc) ou simplement d'une variable locale, comme ci-dessous:

List<Base> aListOfItems = ...;

Future<List<Base>> GetItemList(){

    return new Future(aListOfItems);

}
41
Daniel Robinson

Si vous devez créer un futur, vous pouvez utiliser un Completer. Voir Completer class dans la documentation. Voici un exemple:

Future<List<Base>> GetItemList(){
  var completer = new Completer<List<Base>>();

  // At some time you need to complete the future:
  completer.complete(new List<Base>());

  return completer.future;
}

Mais la plupart du temps, vous n'avez pas besoin de créer un avenir avec un completer. Comme dans ce cas:

Future<List<Base>> GetItemList(){
  var completer = new Completer();

  aFuture.then((a) {
    // At some time you need to complete the future:
    completer.complete(a);
  });

  return completer.future;
}

Le code peut devenir très compliqué à l'aide de finisseurs. Vous pouvez simplement utiliser ce qui suit à la place, car then() renvoie également un Future:

Future<List<Base>> GetItemList(){
  return aFuture.then((a) {
    // Do something..
  });
}

Ou un exemple pour le fichier io:

Future<List<String>> readCommaSeperatedList(file){
  return file.readAsString().then((text) => text.split(','));
}

Voir cet article de blog pour plus de conseils.

72
Fox32

Vous pouvez simplement utiliser le Future<T>value constructeur d'usine:

return Future<String>.value('Back to the future!');
21
Sebastian Engel

@ Fox32 a l'addition de réponse correcte à laquelle nous devons mentionner le type du complément, sinon nous obtenons une exception

Exception received is type 'Future<dynamic>' is not a subtype of type 'FutureOr<List<Base>>

donc l'initialisation du completer deviendrait

var completer= new Completer<List<Base>>();

6
silentsudo

Ou vous pouvez le marquer comme une méthode async:

Future<String> myFutureMethod() async {

  // do something that takes a while

  return 'done';
}
2
Suragch