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);
}
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.
Vous pouvez simplement utiliser le Future<T>value
constructeur d'usine:
return Future<String>.value('Back to the future!');
@ 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>>();
Ou vous pouvez le marquer comme une méthode async
:
Future<String> myFutureMethod() async {
// do something that takes a while
return 'done';
}