Дарт, как создать будущее, чтобы вернуться в свои собственные функции?
можно ли создать свое собственное будущее в Dart, чтобы вернуться из ваших методов, или вы всегда должны возвращать встроенный в будущем возврат из одного из методов асинхронных библиотек dart?
Я хочу, чтобы определить функцию, которая всегда возвращает Future<List<Base>>
действительно ли он выполняет асинхронный вызов (чтение файла / ajax / etc) или просто получает локальную переменную, как показано ниже:
List<Base> aListOfItems = ...;
Future<List<Base>> GetItemList(){
return new Future(aListOfItems);
}
2 ответов
Если вам нужно, чтобы создать будущее, вы можете использовать Completer
. См.Completer
класс в документации. Вот пример:
Future<List<Base>> GetItemList(){
var completer = new Completer();
// At some time you need to complete the future:
completer.complete(new List<Base>());
return completer.future;
}
но большую часть времени вам не нужно создавать будущее с более полным. Как в этом случае:
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;
}
код может стать очень сложным, используя completers. Вместо этого вы можете просто использовать следующее, потому что then()
возвращает Future
тоже:
Future<List<Base>> GetItemList(){
return aFuture.then((a) {
// Do something..
});
}
или пример для файла Ио:
Future<List<String>> readCommaSeperatedList(file){
return file.readAsString().then((text) => text.split(','));
}
посмотреть этот блог для получения дополнительных советов.
@Fox32 имеет правильный ответ, кроме того, нам нужно упомянуть тип полного, иначе мы получим исключение
Exception received is type 'Future<dynamic>' is not a subtype of type 'FutureOr<List<Base>>
таким образом, инициализация completer станет
var completer= new Completer<List<Base>>();